2010-11-19 5 views
2

Je vous écris client WCF pour writtern de service en Java par l'un des partenaires. Je reçois une exception quand je fais le premier appel de service à leur service. Mais la demande subséquente n'a émis aucune exception. J'utilise une application console pour tester cela. Pourquoi est-ce échouer la première fois pas d'autres fois?Erreur lors de premier service WCF appel

Voici le code que je fais appel au service plusieurs fois

for (int i = 0; i < 3; i++) 
{ 
    ServiceClientTest(); 
} 

Voici le code de liaison

TransportBindingElement transportElement = null; 
     transportElement = new HttpsTransportBindingElement(); 
     ((HttpsTransportBindingElement)transportElement).AuthenticationScheme = AuthenticationSchemes.Basic; 

     var messegeElement = new TextMessageEncodingBindingElement 
     { 
      MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap11, AddressingVersion.None), 
      ReaderQuotas = 
        { 
         MaxArrayLength = 200000, 
         MaxBytesPerRead = 200000, 
         MaxDepth = 200000, 
         MaxNameTableCharCount = 200000, 
         MaxStringContentLength = 200000 
        } 
     }; 

     var binding = new CustomBinding(messegeElement, transportElement); 
     return binding; 

Voici les détails d'exception de la première demande

Impossible de marquer CompanyXYZ ServiceCompany System.ServiceModel.CommunicationException: Une erreur est survenue lors de la réception de la réponse HTTP à https://test.intelligentcusomer.ServiceCompany.com/XYZCompanyAdapter/1.0. Cela peut être dû à la liaison de point de terminaison de service n'utilisant pas le protocole HTTP. Cela peut également être dû à l'abandon d'un contexte de requête HTTP par le serveur (probablement en raison de l'arrêt du service). Voir les journaux du serveur pour plus de détails. ---> System.Net.WebException: La connexion sous-jacente a été fermée: Une erreur inattendue s'est produite sur une réception. ---> System.IO.IOException: Impossible de lire les données de la connexion de transport: Une connexion établie a été annulée par le logiciel de votre machine hôte. ---> System.Net.Sockets.SocketException: une connexion établie a été abandonnée par le logiciel dans la machine hôte à System.Net.Sockets.NetworkStream.Read (tampon byte [], Int32 offset, taille Int32) - - Fin de la trace de la pile d'exception interne --- at System.Net.ConnectStream.Read (tampon Byte [], décalage Int32, taille Int32) at System.Net.HttpWebRequest.MakeMemoryStream (flux de flux) --- Fin de trace de pile d'exception interne --- at System.Net.HttpWebRequest.GetResponse() at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply (TimeSpan timeout) --- Fin de la trace de pile d'exception interne ---

trace de pile du serveur: à System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException (WebException WebException, HttpWebRequest demande, HttpAbortReason abortReason) à System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply (TimeSpan timeout) à System.ServiceModel .Channels.RequestChannel.Request (Message message, TimeSpan timeout) at System.ServiceModel.Dispatcher.RequestChannelBinder.Request (Message, TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.Call (Action de chaîne, Boolean oneway, ProxyOperationRuntime fonctionnement, Object [] ins, objet [] out, temporisation TimeSpan) à System.ServiceModel.Channels.ServiceChannelProxy.InvokeService (IMethodCallMessage methodCall, opération ProxyOperationRuntime) à System.ServiceModel.Channels.ServiceChannelProxy.Invoke (message IMessage)

Exception relancée à [0]: à System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (IMessage reqMsg, IMessage retMsg) au système. Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData & MSGDATA, le type Int32) à MyCompany.Services.Clients.ServiceCompany.XYZCompanyAdapter.process (demande processRequest) à MyCompany.Services.Clients.ServiceCompany.XYZCompanyAdapterClient.MyCompany.Services. Clients.ServiceCompany.XYZCompanyAdapter.process (requête processRequest) dans C: \ Projects \ MyCompany \ MyCompany.Distribution \ CustomDeliveryProcessor \ Clients \ XYZCompanyServiceClient.cs: ligne 1122 à mon Company.Services.Clients.ServiceCompany.XYZCompanyAdapterClient.processus (process process1) dans C: \ Projects \ MyCompany \ MyCompany.Distribution \ CustomDeliveryProcessor \ Clients \ XYZCompanyServiceClient.cs: ligne 1129 à CustomDeliveryProcessor.CusomerDelivery.CompanyTestTest() dans C: \ Projects \ MyCompany \ MyCompany.Distribution \ CustomDeliveryProcessor \ CusomerDelivery.cs: ligne 131

+0

Est-ce que cela se produit pour le premier appel pour chaque machine client? Ou juste le premier appel depuis le redémarrage du serveur web? Peut-être que la connexion client expire parce que le serveur Web n'a pas encore démarré le service Web. –

Répondre

3

J'ai corrigé cette erreur en définissant la propriété KeepAlive sur false. Ce que j'ai trouvé s'est passé, quand la première demande envoyée au point de terminaison de service, a reçu la réponse du serveur (il est obivieux parce que le service utilisant l'authentification de base puis le client a envoyé l'en-tête d'autorisation de base). Le comportement par défaut du point de terminaison client est de maintenir la connexion active. Bien que la connexion soit fermée, le client envoie toujours la requête suivante en utilisant la même connexion que celle déjà fermée par le serveur qui provoque l'erreur mentionnée ci-dessus dans la question. Mais cette erreur ne se reproduira plus pour les demandes suivantes car le client envoie une requête avec en-tête d'autorisation dans la première requête elle-même. Il n'y a donc aucune chance de réponse 401. Ce que j'ai fait pour résoudre ce problème qui définit la propriété Keep alive sur false. Ainsi, après la réponse 401, le client envoie une autre requête avec une nouvelle connexion au lieu d'utiliser l'ancienne connexion. Voici le code

Binding binding = null; 
     var transportElement = new HttpsTransportBindingElement 
           { 
            AuthenticationScheme = AuthenticationSchemes.Basic, 
            KeepAliveEnabled = false, 
           }; 

     var messegeElement = new TextMessageEncodingBindingElement 
     { 
      MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap11, AddressingVersion.None), 
      ReaderQuotas = 
      { 
       MaxArrayLength = 200000, 
       MaxBytesPerRead = 200000, 
       MaxDepth = 200000, 
       MaxNameTableCharCount = 200000, 
       MaxStringContentLength = 200000 
      } 
     }; 
     binding = new CustomBinding(messegeElement, transportElement); 

     return binding; 
Questions connexes