2009-11-23 9 views
2

Je dispose d'un service Web dans l'application WinForm. J'ai généré un encapsuleur de service Web et invoqué une méthode de service Web de manière asynchrone. Je reçois l'exception suivante dans mon gestionnaire d'événements completed result (l'événement est généré depuis la classe wrapper du service Web). Quel pourrait être le problème?SocketException lors de la consommation du service Web

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

Malheureusement, je ne peux pas mettre le code complet de l'emballage ici. Mais c'est le args événement que j'accès (voir le résultat ci-dessous propriété)

<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

Pouvez-vous montrer l'emballage? –

+0

Mise à jour de l'article avec l'extrait de code pertinent de la classe wrapper. Cette classe a été générée par Visual Studio 2005 lorsque nous faisons "Ajouter une référence Web" et sélectionnez le service Web. Puisqu'il s'agit d'un problème aléatoire, je trouve qu'il est difficile de le réparer. Si je pouvais obtenir quelques conseils sur les vérifications possibles, cela faciliterait le dépannage. – byte

+0

Avez-vous trouvé quel était le problème, j'ai les mêmes messages d'erreur. – Martin

Répondre

1

J'ai eu un problème similaire quand j'ai essayé de réutiliser une instance de prise plusieurs fois. Même avec socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);, il semble ne pas être fiable.

Je n'utilise wrapper de service Web .NET, mais vous devriez regarder peut-être quelque chose comme (la mise en œuvre d'adapter ...):

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

Ou tout simplement créer une nouvelle instance de la demande de service Web avant chaque appel ...

Questions connexes