2009-11-23 3 views
2

WinForm 응용 프로그램에서 웹 서비스가 사용 중입니다. 웹 서비스 래퍼를 생성하고 비동기 적으로 웹 서비스 메서드를 호출했습니다. 내 결과 완료 이벤트 처리기에서 예외가 발생합니다 (이벤트는 웹 서비스 래퍼 클래스 내에서 발생합니다). 무엇이 문제 일 수 있습니까?웹 서비스를 사용할 때 SocketException이 발생했습니다.

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() 

불행히도 여기에 완전한 래퍼 코드를 넣을 수 없습니다. 하지만이 이벤트에 액세스 할 수 있습니다 (아래 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 
+0

래퍼를 표시 할 수 있습니까? –

+0

관련 코드 스 니펫이있는 게시물을 래퍼 클래스에서 업데이트했습니다. 이 클래스는 "웹 참조 추가"를 수행하고 웹 서비스를 선택할 때 Visual Studio 2005에서 생성되었습니다. 이것은 임의적 인 문제이므로 해결하기가 어렵습니다. 가능한 수표에 대한 몇 가지 지침을 얻을 수 있다면 문제 해결이 더 쉬울 것입니다. – byte

+0

문제점을 발견 했습니까? 동일한 오류 메시지가 나타납니다. – Martin

답변

1

소켓 인스턴스를 여러 번 재사용하려고했을 때 비슷한 문제가 발생했습니다. socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);과 함께해도 신뢰할 수없는 것 같습니다.

나는 .NET 웹 서비스 래퍼를 사용하지 않는,하지만 당신은 아마도 (적응 구현 ...)처럼 뭔가를 찾고해야합니다

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

또는 단순히 웹 서비스 요청의 새 인스턴스를 만들 각 통화를하기 전에 ...

관련 문제