繁体   English   中英

使用Web Service时出现SocketException

[英]SocketException when consuming Web Service

我在WinForm应用程序中使用了一个Web服务。 我生成了一个Web Service包装器,并异步调用了Web Service方法。 我在结果完成的事件处理程序中收到以下异常(该事件从Web Service包装器类内部引发)。 可能是什么问题呢?

    System.Reflection.TargetInvocationException: An exception occurred during the operation, making the result invalid.  Check InnerException for exception details. 
---> System.Net.WebException: Unable to connect to the remote server 
---> System.Net.Sockets.SocketException: A connect request was made on an already connected socket
       at System.Net.Sockets.Socket.BeginConnectEx(EndPoint remoteEP, Boolean flowContext, AsyncCallback callback, Object state)
       at System.Net.Sockets.Socket.UnsafeBeginConnect(EndPoint remoteEP, AsyncCallback callback, Object state)
       at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& exception)
       --- End of inner exception stack trace ---
       at System.Web.Services.Protocols.WebClientAsyncResult.WaitForResponse()
       at System.Web.Services.Protocols.WebClientProtocol.EndSend(IAsyncResult asyncResult, Object& internalAsyncState, Stream& responseStream)
       at System.Web.Services.Protocols.SoapHttpClientProtocol.InvokeAsyncCallback(IAsyncResult result)
       --- End of inner exception stack trace ---
       at System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()

不幸的是,我无法在此处放置完整的包装器代码。 但这是我访问的事件args(请参见下面的Result属性)

<ComVisible(False), System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "2.0.50727.3053")> _
    Public Delegate Sub MyCompletedEventHandler(ByVal sender As Object, ByVal e As MyCompletedEventArgs)

<ComVisible(False), _
     System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "2.0.50727.3053"), _
     System.Diagnostics.DebuggerStepThroughAttribute(), _
     System.ComponentModel.DesignerCategoryAttribute("code")> _
    Partial Public Class MyCompletedEventArgs
        Inherits System.ComponentModel.AsyncCompletedEventArgs

        Private results() As Object

        Friend Sub New(ByVal results() As Object, ByVal exception As System.Exception, ByVal cancelled As Boolean, ByVal userState As Object)
            MyBase.New(exception, cancelled, userState)
            Me.results = results
        End Sub

        '''<remarks/>
        Public ReadOnly Property Result() As MyResponse
            Get
                Me.RaiseExceptionIfNecessary()
                Return CType(Me.results(0), MyResponse)
            End Get
        End Property
    End Class

Private Sub OnMyOperationCompleted(ByVal arg As Object)
            If (Not (Me.MyCompletedEvent) Is Nothing) Then
                Dim invokeArgs As System.Web.Services.Protocols.InvokeCompletedEventArgs = CType(arg, System.Web.Services.Protocols.InvokeCompletedEventArgs)
                RaiseEvent MyPointsCompleted(Me, New MyCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState))
            End If
        End Sub

当我尝试多次重用套接字实例时,我遇到了类似的问题。 即使使用socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); ,似乎不可靠。

我不使用.NET Web服务包装器,但是您也许应该寻找类似的东西(实现以适应...):

try 
{
    // socket connection...
}
catch (SocketException ex)
{
    if (ex.SocketErrorCode == SocketError.AddressAlreadyInUse) 
    {
        // retry with a new instance socket.
    }
}

或者只是在每次调用之前创建Web服务请求的新实例...

当您调用具有受限协议(例如TLS 1.2)的Web服务时,可能会发生SocketException

如果已确定是这种情况,则可以参考以下示例,了解有关如何为此修改代码的几个示例: 更新.NET Web服务以使用TLS 1.2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM