0

我正在使用C#中的EConnect集成。我正在測試GP連接字符串的函數。基本上,該字符串由GP的數據服務器名稱和數據庫名稱組成。如果數據庫名稱錯誤,則會引發eConnect異常並且很容易捕獲和跟蹤。當服務器名稱錯誤時,用於測試連接的getentity函數將會旋轉並超時。所以我使用IAsyncResult和一個等待句柄來測試應用程序是否超時。如果應用程序超時,我重新啓動服務並允許用戶重新輸入服務器名稱。現在我得到的問題是我測試後輸入錯誤的服務器,一切都重置我得到System.ServiceModel.CommunicationObjectFaultedException。CommunicationObjectFaultedException - System.ServiceModel.Channels.ServiceChannel不能用於通信,因爲它處於故障狀態

這裏是我從異常獲取信息:

An exception of type 'System.ServiceModel.CommunicationObjectFaultedException' occurred in System.ServiceModel.dll but was not handled in user code 

Additional information: The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state. 

System.ServiceModel.CommunicationObjectFaultedException was unhandled by user code 
    HResult=-2146233087 
    Message=The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state. 
    Source=System.ServiceModel 
    StackTrace: 
    at System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannelFactory.OnClose(TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannelFactory.TypedServiceChannelFactory`1.OnClose(TimeSpan timeout) 
    at System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan timeout) 
    at System.ServiceModel.ChannelFactory.OnClose(TimeSpan timeout) 
    at System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan timeout) 
    at Microsoft.Dynamics.GP.eConnect.ServiceProxy.Dispose() 
    at Microsoft.Dynamics.GP.eConnect.eConnectMethods.Dispose() 
    at GP_Import___Sylectus.UpdateGPConnection.TestGPConnection() in C:\GP Import - Sylectus\GP Import - Sylectus\UpdateGPConnection.cs:line 265 
    at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Object[]& outArgs) 
    at System.Runtime.Remoting.Messaging.StackBuilderSink.AsyncProcessMessage(IMessage msg, IMessageSink replySink) 
    InnerException: 

這裏是我的代碼:

namespace GP_Import___Sylectus 
{ 
    public partial class UpdateGPConnection : Form 
    { 
     Task task; 
     AsyncCallback cb; 
     public delegate string startProcessToCall(); 
     startProcessToCall sp2c; 
     bool test = false; 
     string testResult = "";    

     public UpdateGPConnection() 
     { 
      InitializeComponent(); 
      this.txtDatasourceName.Text = ConfigurationManager.AppSettings.Get("GPDataServer"); 
      this.txtDatabaseName.Text = ConfigurationManager.AppSettings.Get("GPDatabase");       

      cb = new AsyncCallback(startProcessCallback); 
      sp2c = new startProcessToCall(TestGPConnection); 
     } 

     public void startProcessCallback(IAsyncResult iar) 
     { 
      startProcessToCall mc = (startProcessToCall)iar.AsyncState; 
      //bool result = mc.EndInvoke(iar); 
      //Console.WriteLine("Function value = {0}", result); 
     } 

     private void btnUpdate_Click(object sender, EventArgs e) 
     { 
      var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
      config.AppSettings.Settings["GPDataServer"].Value = txtDatasourceName.Text.ToUpper(); 
      config.AppSettings.Settings["GPDatabase"].Value = txtDatabaseName.Text.ToUpper(); 
      config.Save(ConfigurationSaveMode.Modified); 

      ConfigurationManager.RefreshSection("appSettings"); 

      GPCongfigSettings.GPConnectionString = @"data source=" + txtDatasourceName.Text.ToUpper() + ";initial catalog=" + txtDatabaseName.Text.ToUpper() + ";integrated security=SSPI;persist security info=False;packet size=4096"; 

      IAsyncResult asyncResult = null; 
      asyncResult = sp2c.BeginInvoke(cb, null); 


      Thread.Sleep(0); 

      Cursor.Current = Cursors.WaitCursor; 
      test = asyncResult.AsyncWaitHandle.WaitOne(15000); 

      if (test) 
      { 
       try 
       { 
        testResult = sp2c.EndInvoke(asyncResult); 
       } 
       catch (Exception exc) 
       { 
        Console.WriteLine(exc.Message); 
       } 
      } 

      bool result = asyncResult.IsCompleted; 

      string eConnectServiceName = ConfigurationManager.AppSettings.Get("eConnectServiceName"); 

      string eConnectProcess = ConfigurationManager.AppSettings.Get("eConnectProcess"); 

      Process[] process = Process.GetProcessesByName(eConnectProcess); 

      if (!test) 
      {       

       foreach (Process tempProcess in process) 
       { 
        tempProcess.Kill(); 
       } 
       RestartService(eConnectServiceName, 20000); 

       RestartService(eConnectServiceName, 20000); 
      } 

      asyncResult.AsyncWaitHandle.Close(); 


      Cursor.Current = Cursors.Default;     

      if (test == false) 
      { 
       MessageBox.Show("Dataserver Name is Incorrect", "Connection String Error", MessageBoxButtons.OK, MessageBoxIcon.Stop); 
      } 
      else 
      { 
       if (testResult == "Correct Connection") 
       { 
        MessageBox.Show("Connection String Successfully Updated", "", MessageBoxButtons.OK); 
        this.Close(); 
       } 
       else if (testResult.Contains("eConnect Exception")) 
       { 
        MessageBox.Show("Database Name is Incorrect", "Connection String Error", MessageBoxButtons.OK, MessageBoxIcon.Stop); 
       } 
       else 
       { 
        MessageBox.Show(testResult, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
        RestartService(eConnectServiceName, 20000); 
       } 
      }    
     }   

     public string TestGPConnection() 
     { 

      eConnectMethods requester = new eConnectMethods(); 
      try 
      {     

       // Create an eConnect document type object 
       eConnectType myEConnectType = new eConnectType(); 

       // Create a RQeConnectOutType schema object 
       RQeConnectOutType myReqType = new RQeConnectOutType(); 

       // Create an eConnectOut XML node object 
       eConnectOut myeConnectOut = new eConnectOut(); 

       // Populate the eConnectOut XML node elements 
       myeConnectOut.ACTION = 1; 
       myeConnectOut.DOCTYPE = "GL_Accounts"; 
       myeConnectOut.OUTPUTTYPE = 2; 
       myeConnectOut.FORLIST = 1; 
       myeConnectOut.WhereClause = "(ACTNUMST = '99-9999-99-999')"; 

       // Add the eConnectOut XML node object to the RQeConnectOutType schema object 
       myReqType.eConnectOut = myeConnectOut; 

       // Add the RQeConnectOutType schema object to the eConnect document object 
       RQeConnectOutType[] myReqOutType = { myReqType }; 
       myEConnectType.RQeConnectOutType = myReqOutType; 

       // Serialize the eConnect document object to a memory stream 
       MemoryStream myMemStream = new MemoryStream(); 
       XmlSerializer mySerializer = new XmlSerializer(myEConnectType.GetType()); 
       mySerializer.Serialize(myMemStream, myEConnectType); 
       myMemStream.Position = 0; 

       // Load the serialized eConnect document object into an XML document object 
       XmlTextReader xmlreader = new XmlTextReader(myMemStream); 
       XmlDocument myXmlDocument = new XmlDocument(); 
       myXmlDocument.Load(xmlreader); 

       var tokenSource = new CancellationTokenSource(); 
       CancellationToken token = tokenSource.Token; 
       int timeOut = 20000; //20 seconds 

       try 
       { 
        string reqDoc = requester.GetEntity(GPCongfigSettings.GPConnectionString, myXmlDocument.OuterXml); 
       } 
       catch (CommunicationObjectFaultedException cofe) 
       { 
        return "Communication Exception - " + cofe.Message; 
       } 

       //connection string is correct 
       return "Correct Connection"; 


      } 
      catch (FaultException fe) 
      { 
       return "Fault Exception - " + fe.Message; 
      } 
      catch (eConnectException exc) 
      { 
       Console.WriteLine(exc.Message); 
       return "eConnect Exception - " + exc.Message; 
      }    
      catch (CommunicationObjectFaultedException cofe) 
      { 
       return "Communication Exception - " + cofe.Message; 
      } 
      catch (Exception ex) 
      { 
       return "Exception - " + ex.Message; 
      } 
      finally 
      { 
       // Release the resources of the eConnectMethods object 
       requester.Dispose(); 
      } 
     } 

     private void btnExit_Click(object sender, EventArgs e) 
     { 
      this.Close(); 
     } 

     public static void RestartService(string serviceName, int timeoutMilliseconds) 
     { 
      ServiceController service = new ServiceController(serviceName); 
      try 
      { 

       int millisec1 = Environment.TickCount; 
       TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); 

       if (!service.Status.Equals(ServiceControllerStatus.Stopped)) 
       { 
        service.Stop(); 
        service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); 
       } 


       // count the rest of the timeout 
       int millisec2 = Environment.TickCount; 
       timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2 - millisec1)); 

       if (service.Status.Equals(ServiceControllerStatus.Stopped) || service.Status.Equals(ServiceControllerStatus.StopPending)) 
       { 
        service.Start(); 
        service.WaitForStatus(ServiceControllerStatus.Running, timeout); 
       } 
      } 
      catch (Exception ex) 
      { 
       // ... 
      } 
     }   


    } 

} 

錯誤似乎總是當我嘗試出售其於TestGPConnection請求者方法發生。

任何想法我應該做什麼?我一直在使用Google這一整天,我很困惑,我發現如何解決這個問題。

+0

我認爲你發現問題時,纔會有溝通上的錯誤。你可以嘗試使用該頻道嗎? – bdn02

+0

不完全確定你的意思 – Kristen

+0

你的代碼中哪一行是'265行'? – Rahul

回答

0

試圖改變你的代碼:


     public string TestGPConnection() 
     { 
      try 
      {     
       using (eConnectMethods requester = new eConnectMethods()) 
       { 
       // Create an eConnect document type object 
       eConnectType myEConnectType = new eConnectType(); 

       // Create a RQeConnectOutType schema object 
       RQeConnectOutType myReqType = new RQeConnectOutType(); 

       // Create an eConnectOut XML node object 
       eConnectOut myeConnectOut = new eConnectOut(); 

       // Populate the eConnectOut XML node elements 
       myeConnectOut.ACTION = 1; 
       myeConnectOut.DOCTYPE = "GL_Accounts"; 
       myeConnectOut.OUTPUTTYPE = 2; 
       myeConnectOut.FORLIST = 1; 
       myeConnectOut.WhereClause = "(ACTNUMST = '99-9999-99-999')"; 

       // Add the eConnectOut XML node object to the RQeConnectOutType schema object 
       myReqType.eConnectOut = myeConnectOut; 

       // Add the RQeConnectOutType schema object to the eConnect document object 
       RQeConnectOutType[] myReqOutType = { myReqType }; 
       myEConnectType.RQeConnectOutType = myReqOutType; 

       // Serialize the eConnect document object to a memory stream 
       MemoryStream myMemStream = new MemoryStream(); 
       XmlSerializer mySerializer = new XmlSerializer(myEConnectType.GetType()); 
       mySerializer.Serialize(myMemStream, myEConnectType); 
       myMemStream.Position = 0; 

       // Load the serialized eConnect document object into an XML document object 
       XmlTextReader xmlreader = new XmlTextReader(myMemStream); 
       XmlDocument myXmlDocument = new XmlDocument(); 
       myXmlDocument.Load(xmlreader); 

       var tokenSource = new CancellationTokenSource(); 
       CancellationToken token = tokenSource.Token; 
       int timeOut = 20000; //20 seconds 

       try 
       { 
        string reqDoc = requester.GetEntity(GPCongfigSettings.GPConnectionString, myXmlDocument.OuterXml); 
       } 
       catch (CommunicationObjectFaultedException cofe) 
       { 
        return "Communication Exception - " + cofe.Message; 
       } 

       //connection string is correct 
       return "Correct Connection"; 
       } 
      } 
      catch (FaultException fe) 
      { 
       return "Fault Exception - " + fe.Message; 
      } 
      catch (eConnectException exc) 
      { 
       Console.WriteLine(exc.Message); 
       return "eConnect Exception - " + exc.Message; 
      }    
      catch (CommunicationObjectFaultedException cofe) 
      { 
       return "Communication Exception - " + cofe.Message; 
      } 
      catch (Exception ex) 
      { 
       return "Exception - " + ex.Message; 
      } 
      //finally 
      //{ 
      // // Release the resources of the eConnectMethods object 
      // requester.Dispose(); 
      //} 
     } 

+1

這不應該解決問題。因爲'使用'和'try .. finally'都是一樣的嗎?不知道你認爲這將如何解決 – Rahul

+0

這至少可以更好地處理錯誤,不會導致visual basic崩潰我的應用程序,而是通過發送異常通過,以便我可以將它顯示在消息框中。另一件事我注意到,一旦消息框顯示CommunicationObjectFaultedException異常,如果我關閉它並重新輸入我的信息,它會正常工作 – Kristen

相關問題