WCF“一个现有的连接被强行关闭远程主机”关闭客户端后(wcf “An existing conne

2019-08-03 16:24发布

我得到错误“的现有连接被强行关闭远程主机”后,我关闭客户端程序。 我加入这个代码,以确保当程序被关闭,关闭客户端连接。

我也有一个按钮来关闭客户端和按钮的作品没有一个错误。

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{          
    try
    {
       client.Close();  
    }
    catch (CommunicationException ex)
    {
       client.Abort();
    }
    catch (TimeoutException ex)
    {
       client.Abort();
    }
    catch (Exception ex)
    {
       client.Abort();
       throw ex;
    }
}

难道我在这里错过了什么? 这是堆栈跟踪:

< StackTrace>
bei System.ServiceModel.Channels.SocketConnection.HandleReceiveAsyncCompleted()
bei System.ServiceModel.Channels.SocketConnection.OnReceiveAsync(Object sender, SocketAsyncEventArgs eventArgs)
bei System.ServiceModel.Channels.SocketConnection.OnReceiveAsyncCompleted(Object sender, SocketAsyncEventArgs e)
bei System.Net.Sockets.SocketAsyncEventArgs.OnCompleted(SocketAsyncEventArgs e)
bei System.Net.Sockets.SocketAsyncEventArgs.FinishOperationAsyncFailure(SocketError socketError, Int32 bytesTransferred, SocketFlags flags)
bei System.Net.Sockets.SocketAsyncEventArgs.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
bei System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
< /StackTrace>

我希望堆栈跟踪帮助别人帮我:d我使用nettcp,只有当我关闭程序时出现错误。

谢谢,曼努埃尔

更新:WCF配置:服务器:

 <serviceBehaviors>
        <behavior name="MyBehaviour">
          <serviceMetadata/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
 <services>
      <service name="Service" behaviorConfiguration="MyBehaviour">
        <host>
        </host>

        <endpoint address="" binding="netTcpBinding" bindingConfiguration="TCP" contract="IService"/>
        <endpoint address="mextcp" binding="mexTcpBinding" contract="IMetadataExchange"/>

      </service>
    </services>

<netTcpBinding>
        <binding name="TCP" portSharingEnabled="true" receiveTimeout="01:30:00" sendTimeout="01:10:00"
          openTimeout="00:10:00" closeTimeout="00:10:00">
         <security mode="None"/>
        </binding>
      </netTcpBinding>

客户:

<configuration>
    <system.serviceModel>
        <bindings>
            <netTcpBinding>
               <binding name="NetTcpBinding_IService" receiveTimeout="01:30:00" sendTimeout="01:00:00" openTimeout="00:10:00" closeTimeout="00:10:00">
               <security mode="None" />
              </binding>
            </netTcpBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://host/Service.svc"
                binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IService"
                contract="ServiceRef.IService" name="NetTcpBinding_IService" />
        </client>
    </system.serviceModel>
</configuration>

Answer 1:

有此错误的几个可能的原因,但是,当对等体已经关闭,以连接的最通常的原因是发送数据:换句话说,应用协议错误。 另外,也可能的是,对等体已经通过故意重置连接,而不是正常关闭它行为不端。 在这两种情况下,有没有什么可以比关闭套接字,忘了同行其他运行时做的。 但是,你应该调查的原因,编译时间之前。



Answer 2:

有原因的错误的数量。 如果序列化对象没有很好地也形成该有点儿误差将从WCF被抛出。 考虑一个例子:在我的要求我一定要送的主数据(说的例如:用户,产品,国家)通过响应类对象的客户端。 在我添加了通用类对象我已经使用,而不是主类对象同类产品,country.At那个时候,我得到了同样的错误。

公共属性genericObj作为对象

    Public Sub New()
        MyBase.New()
        Me.genericObj = New Object
    End Sub

上面的代码引起了我同样的错误,你做了什么。

然后我改变为如下所示:

  <DataMember()>
    Public Property loginObject As csCSLogin

    Public Sub New()
        MyBase.New()
        Me.loginObject = New csCSLogin
    End Sub


文章来源: wcf “An existing connection was forcibly closed by the remote host” after closing client
标签: c# wcf tcp