2010-10-01 7 views
6

Nasz zespół stara się stworzyć aplikację Windows (C#) do wywołania usługi WCF za pomocą serwera www proxyKlient Windows WCF z internetowym serwerem proxy pokazującym błąd Serwer popełnił naruszenie protokołu. Sekcja = ResponseStatusLine

Pokazuje wyjątek „Serwer popełnione naruszenie protokołu. Sekcja = ResponseStatusLine” podczas wywoływania usługa WCF

proszę dać sugestię, aby rozwiązać ten problem/jakimkolwiek innym alternatywnym rozwiązaniem

//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"; 
} 

Server ślad stosu:

w System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException (WebException WebException, HttpWebRequest prośba HttpAbortReason abortReason)
w ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply (TimeSpan timeout)
w System.ServiceModel.Channels.RequestChannel .Request (wiadomosc, limit czasu TimeSpan)
na System.ServiceModel.Dispatcher.RequestChannelBinder.Request (wiadomosc, limit czasu TimeSpan)
na System.ServiceModel.Channels.ServiceChannel.Call (akcja String, Boolean jednokierunkowy, operacja ProxyOperationRuntime , Object [] ins, Object [] out, Timeout timeout)
w System.ServiceModel.Channels.ServiceChannel.Call (działanie String logicznego jednokierunkowy, operacji ProxyOperationRuntime, obiekt [] iny, obiekt [] out)
w System.ServiceModel.Channels.ServiceChannelProxy.InvokeService (IMethodCallMessage methodCall, ProxyOperationRuntime działanie)
w System.ServiceModel.Channels.ServiceChannelProxy.Invoke (komunikat iMessage)

Wyjątek rethrown w [0]
w System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (iMessage reqMsg, iMessage retMsg)
w System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData & msgData, typ Int32)
na DevicesService.IDevicesService.CheckNetworkConnection (String ipAddress)

Mój klient kod boczny w app.config alt text

Serwer kodu po stronie w pliku web.config alt text

Odpowiedz

2

Kod zadzwonić usług wcf od okien aplikacji klienckiej przy użyciu serwera 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

Nie widziałem tego wyjątku wcześniej, ale już miałem duże problemy, aby proxy działało w ten sposób. Nie wiem dlaczego, ale ustawienie adresu proxy i użycie domyślnego proxy na false w BasicHttpBinding nigdy nie działało dla mnie. Zawsze musiałem używać domyślnego serwera proxy sieci i ustawić tam URL lub utworzyć całe nowe niestandardowe powiązanie i ustawić adres URL proxy w elemencie wiążącym transport http.

+0

Podaj kod/odniesienie do rozwiązywania tego problemu, które już wspomniano w swojej odpowiedzi „pełnomocnika użycie domyślnej internetowej i ustawić tam adres URL lub utwórz całe nowe niestandardowe powiązanie i ustaw adres URL serwera proxy w elemencie wiążącym transport HTTP. " – amexn

2

Wygląda na to, to jest coś, z wyjątkiem catch-all i ma ograniczoną użyteczność wyniku.Zniekształcone nagłówki, trafienie w niewłaściwy port (który zwraca inną sformatowaną odpowiedź) i długość treści w odpowiedzi mogą być przyczyną wyjątków. Jeśli jest to problem z nagłówkiem, możesz nakazać klientowi zignorowanie niebezpiecznych nagłówków (jeśli jest to zaufane źródło).

+0

Pokazuje ten sam błąd po dodaniu do app.config – amexn

+0

To nie jest problem z nagłówkiem. Mój następny podejrzany będzie zadowolony z długości. Sprawdź konfiguracje powiązań na serwerze i kliencie pod kątem MaxXXXMessageSize (XXX = Received or Sent) i sprawdź je. –

+0

Teraz po stronie klienta app.config i po stronie serwera kod web.config pokazany w pytaniu – amexn

1

Czy próbowałeś użyć analizatora ruchu sieciowego, aby uzyskać więcej informacji o tym, co jest wysyłane i odbierane przez klienta i serwer? Może to pomóc w rozwiązaniu problemu, a przynajmniej zidentyfikowaniu głównej przyczyny.

2

Spróbuj zdiagnozować ten krok na raz.

  1. Zmiana servicebehavior dodać <serviceMetadata httpGetEnabled = "true"/> Następnie zmienić ustawienia proxy w IE i przejdź do URL serwisu i sprawdzić, czy można dostać na stronę WSDL.
  2. Zrób powyższe z SoapUI i sprawdź, czy są jakieś błędy. Jeśli WSDL jest dostępny, wygeneruj proxy i wywołaj operację, aby sprawdzić błędy.
  3. Włącz śledzenie WCF zgodnie z opisem here. Tracelogs są bardzo szczegółowe i zdiagnozowałem wiele problemów WCF przy użyciu tej techniki.
  4. Na koniec spróbuj śledzić sieć za pomocą WireShark.
Powiązane problemy