2010-10-01 1 views
6

Notre équipe essaie de créer une application Windows (C#) pour appeler un service WCF utilisant le serveur proxy InternetClient Windows WCF avec serveur proxy Internet présentant une erreur Le serveur a commis une violation de protocole. Section = ResponseStatusLine

Affichage exception "Le serveur a commis une violation de protocole. Section = ResponseStatusLine" tout en appelant le service WCF

S'il vous plaît donner la suggestion de résoudre ce problème/toute autre solution de rechange

//Code for creating proxy 
public static DevicesServiceClient CreateProxy() 
{ 
    var proxy = new DevicesServiceClient("BasicHttpBinding_IDevicesService"); 

    BasicHttpBinding binding = new BasicHttpBinding(); 
    binding.Security.Mode = BasicHttpSecurityMode.None; 
    binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None; 
    binding.UseDefaultWebProxy = false; 
    binding.ProxyAddress = new Uri(string.Format("http://{0}:{1}", "192.168.0.20","808")); 
    proxy.Endpoint.Binding = binding; 

    proxy.ClientCredentials.UserName.UserName = "Username"; 
    proxy.ClientCredentials.UserName.Password = "Password"; 
} 

pile de serveur trace:

à System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException (WebException WebException, HttpWebRequest demande, HttpAbortReason abortReason)
à ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply (timeout TimeSpan)
à System.ServiceModel.Channels.RequestChannel .Request (message d'un message, délai d'TimeSpan)
à System.ServiceModel.Dispatcher.RequestChannelBinder.Request (message du message, délai d'TimeSpan)
à System.ServiceModel.Channels.ServiceChannel.Call (action de cordes à sens unique booléenne, opération de ProxyOperationRuntime , Object [] ins, Object [] outs, délai TimeSpan)
à System.ServiceModel.Channels.ServiceChannel.Call (action de la chaîne, à sens unique booléenne, opération de ProxyOperationRuntime, Object [] ins, Object [] out)
à System.ServiceModel.Channels.ServiceChannelProxy.InvokeService (IMethodCallMessage methodCall, ProxyOperationRuntime fonctionnement)
à System.ServiceModel.Channels.ServiceChannelProxy.Invoke (message IMessage)

Exception relancée à [0]:
à System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (IMessage reqMsg, IMessage retMsg)
à System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData & MSGDATA, le type Int32)
à DevicesService.IDevicesService.CheckNetworkConnection (String ipAddress)

Ma code côté client dans app.config alt text

mon code côté serveur dans web.config

alt text

Répondre

2

Code pour appeler le service WCF à partir de Windows application client utilisant le serveur proxy

  { 
       var proxy = new DevicesServiceClient("BasicHttpBinding_IDevicesService"); 
       BasicHttpBinding binding = new             BasicHttpBinding("BasicHttpBinding_IDevicesService"); 
       var proxySettings = ApplicationDetails.CheckProxySettings(); 

       Uri domainAddress; 
       var strtemp = new string[] { }; 
       //WebProxy webproxy = new WebProxy(); 
       var networkCredentials = new NetworkCredential(); 
       if (proxySettings.ProxyServerType == "http") 
       { 
        domainAddress = new Uri(string.Format("http://{0}:{1}", proxySettings.ProxyServerAddress, proxySettings.ProxyServerPort)); 
       } 
       else if (proxySettings.ProxyServerType == "https") 
       { 
        domainAddress = new Uri(string.Format("https://{0}:{1}", proxySettings.ProxyServerAddress, proxySettings.ProxyServerPort)); 
       } 
       else 
       { 
        domainAddress = new Uri(string.Format("http://{0}:{1}", proxySettings.ProxyServerAddress, proxySettings.ProxyServerPort)); 
       } 
       // 
       WebProxy webproxy = new WebProxy(domainAddress.ToString(), true, strtemp); 
       // 

       //networkCredentials.Domain = domainAddress.ToString(); 
       if (proxySettings.ProxyAuthentication == "1") 
       { 
        networkCredentials.UserName = proxySettings.Username; 
        networkCredentials.Password = proxySettings.Password; 
       } 
       webproxy.Credentials = networkCredentials; 
       webproxy.BypassProxyOnLocal = false; 
       WebRequest.DefaultWebProxy = webproxy; 
       binding.UseDefaultWebProxy = true; 
       proxy.Endpoint.Binding = binding; 

      } 
2

Je n'ai pas vu cette exception auparavant, mais j'avais déjà de gros problèmes pour faire fonctionner le proxy de cette façon. Je ne sais pas pourquoi mais définir l'adresse proxy et utiliser le proxy par défaut à false dans BasicHttpBinding n'a jamais fonctionné pour moi. J'ai toujours dû utiliser le proxy Web par défaut et y définir l'URL ou créer une nouvelle liaison personnalisée et définir l'URL du proxy dans l'élément de liaison de transport http.

+0

S'il vous plaît donner code/référence pour résoudre ce problème que vous avez déjà mentionné dans votre réponse « utiliser le proxy Web par défaut et définir l'URL il ou créez une nouvelle liaison personnalisée et définissez une URL de proxy dans l'élément de liaison de transport http. " – amexn

2

Il ressemble à ceci est quelque chose d'un fourre-tout exception et a une utilité limitée en conséquence.Les en-têtes mal formés, qui tapent le mauvais port (qui renvoie une réponse formatée différente) et la longueur du contenu dans la réponse peuvent tous être des causes de l'exception. Si c'est un problème d'en-tête, vous pouvez dire au client d'ignorer les en-têtes dangereux (s'il s'agit d'une source fiable).

<configuration> 
    <system.net> 
     <settings> 
      <httpWebRequest useUnsafeHeaderParsing="true" /> 
     </settings> 
    </system.net> 
</configuration> 
+0

Afficher la même erreur après l'ajout à app.config – amexn

+0

Pas un problème d'en-tête, alors. Mon prochain suspect serait content. Vérifiez les configurations de liaison sur le serveur et le client pour MaxXXXMessageSize (XXX = Reçu ou Envoyé) et augmentez-les. –

+0

Maintenant App.config côté client & code web.config côté serveur apparaissant dans la question – amexn

1

Avez-vous essayé d'utiliser un analyseur de trafic réseau pour obtenir plus d'informations sur ce qui est envoyé et reçu par votre client et le serveur? Cela pourrait vous aider à résoudre le problème, ou peut-être au moins à identifier la cause première.

2

Essayez de diagnostiquer cette étape à la fois.

  1. Modifier le ServiceBehavior pour ajouter <serviceMetadata httpGetEnabled = "true"/> Ensuite, changez le paramètre de proxy dans Internet Explorer et accédez à l'URL du service et voir si vous pouvez obtenir la page WSDL.
  2. Procédez comme ci-dessus avec SoapUI et vérifiez s'il y a des erreurs. Si WSDL est disponible, générez un proxy et appelez l'opération pour vérifier les erreurs.
  3. Activer le suivi WCF comme décrit here. Les tracelogs sont très détaillés et j'ai diagnostiqué beaucoup de problèmes WCF en utilisant cette technique.
  4. Enfin, essayez le suivi réseau en utilisant WireShark.
Questions connexes