C# CommunicationObjectFaultedException-System.ServiceModel.Channels.ServiceChannel无法用于通信,因为它处于故障状态

C# CommunicationObjectFaultedException-System.ServiceModel.Channels.ServiceChannel无法用于通信,因为它处于故障状态,c#,asynchronous,exception-handling,communicationexception,C#,Asynchronous,Exception Handling,Communicationexception,我正在用C#进行EconConnect集成。我正在处理一个测试GP连接字符串的函数。基本上,字符串由GP的数据服务器名称和数据库名称组成。如果数据库名称错误,将引发eConnect异常,这很容易捕获和跟踪。当服务器名称错误时,Im用于测试连接的getentity函数将旋转并超时。因此,我使用IAsyncResult和等待句柄来测试应用程序是否超时。如果应用程序超时,我将重新启动服务并允许用户重新输入服务器名称。现在我遇到的问题是,我测试输入了错误的服务器,然后重置了所有内容,我得到了System

我正在用C#进行EconConnect集成。我正在处理一个测试GP连接字符串的函数。基本上,字符串由GP的数据服务器名称和数据库名称组成。如果数据库名称错误,将引发eConnect异常,这很容易捕获和跟踪。当服务器名称错误时,Im用于测试连接的getentity函数将旋转并超时。因此,我使用IAsyncResult和等待句柄来测试应用程序是否超时。如果应用程序超时,我将重新启动服务并允许用户重新输入服务器名称。现在我遇到的问题是,我测试输入了错误的服务器,然后重置了所有内容,我得到了System.ServiceModel.CommunicationObjectFaultedException

以下是我从异常中获得的信息:

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中处理请求者方法时,错误似乎总是发生


你知道我该怎么做吗?我在谷歌上搜索了一整天,我对如何解决这个问题感到非常困惑

尝试更改您的代码:


        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();
            //}
        }


我认为只有在沟通出现错误时,你才会发现问题。你能试着用using来使用这个频道吗?不太清楚你的意思是什么,哪一个是你代码中的
第265行
?第265行是:requester.Dispose();然后您应该检查
eConnectMethods
class
Dispose
方法。有些地方失败了。这不应该解决问题。使用
尝试引起
。。最后
二者是否相同?不确定您认为这将如何解决此问题至少可以更好地处理错误,不会导致visual basic使我的应用程序崩溃,而是通过发送异常,以便我可以在messagebox中显示它。我注意到的另一件事是,一旦messagebox显示CommunicationObjectFaultedException异常,如果我关闭它并重新输入信息,它就会正常工作