Клиент Windows WCF с прокси-сервером в Интернете показывает ошибку. Сервер совершил нарушение протокола.Раздел = ResponseStatusLine - PullRequest
6 голосов
/ 01 октября 2010

Наша команда пытается создать приложение Windows (c #) для вызова службы WCF с использованием интернет-прокси-сервера

Отображение исключения "Сервер совершил нарушение протокола. Section = ResponseStatusLine" при вызове службы WCF

Пожалуйста, дайте предложение решить эту проблему / любое другое альтернативное решение

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

Трассировка стека сервера:

в System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException (WebException webException, Запрос HttpWebRequest, HttpAbortReason (abortReason)
в ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply (тайм-аут TimeSpan)
эстакада сообщений типа System.ShannelRequest.System.ServiceModel.Dispatcher.RequestChannelBinder.Request (сообщение-сообщение, время ожидания TimeSpan)
в System.ServiceModel.Channels.ServiceChannel.Call (строковое действие, логическое одностороннее действие, операция ProxyOperationRuntime, объект [] ins, Object [] outs, TimeSpan timeout)
в System.ServiceModel.Channels.ServiceChannel.Call (строковое действие, логический односторонний метод, операция ProxyOperationRuntime, Object [] ins, Object [] outs)
в System.ServiceModel.Channels.ServiceChannelProxy.InvokeService (метод IMethodCallMessageCall, операция ProxyOperationRuntime)
в System.ServiceModel.Channels.ServiceChannelProxy.Invoke (сообщение IMessage)

Исключение системы перезапускается в [0] в момент времени: 10: 20 минут в 10:00.Remoting.1023 *

Мой код на стороне клиента в app.config alt text

Мой код на стороне сервера в web.config alt text

Ответы [ 6 ]

2 голосов
/ 11 октября 2010

Код для вызова службы wcf из клиентского приложения Windows с использованием прокси-сервера

            {
              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 голосов
/ 07 октября 2010

Попробуйте диагностировать это по одному шагу за раз.

  1. Измените поведение службы на добавление <serviceMetadata httpGetEnabled = "true"/> Затем измените настройку прокси в IE, перейдите к URL службы и посмотрите, сможете ли вы получить страницу WSDL.
  2. Сделайте то же самое с SoapUI и посмотрите, есть ли ошибки.Если WSDL доступен, создайте прокси и вызовите операцию, чтобы проверить ошибки.
  3. Включите трассировку WCF, как описано здесь .Tracelogs очень подробны, и я диагностировал много проблем WCF, используя эту технику.
  4. Наконец, попробуйте трассировку сети, используя WireShark .
2 голосов
/ 05 октября 2010

Похоже, это что-то вроде всеобъемлющего исключения и в результате имеет ограниченную полезность.Неправильные заголовки, неправильный порт (который возвращает другой форматированный ответ) и длина содержимого в ответе могут быть причинами для исключения.Если это проблема с заголовком, вы можете указать клиенту игнорировать небезопасные заголовки (если это надежный источник).

<configuration>
    <system.net>
        <settings>
            <httpWebRequest useUnsafeHeaderParsing="true" />
        </settings>
    </system.net>
</configuration>
2 голосов
/ 05 октября 2010

Попробуйте проверить заголовки, возвращаемые вашим прокси-сервером.Похоже, что неправильно сформированные / нестандартные заголовки вызывают это исключение.

http://www.velocityreviews.com/forums/t302174-why-do-i-get-the-server-committed-a-protocol-violation.html

2 голосов
/ 02 октября 2010

Я не видел этого исключения раньше, но у меня уже были большие проблемы, чтобы заставить прокси работать таким образом. Я не знаю почему, но установка адреса прокси и использование прокси по умолчанию в false в BasicHttpBinding никогда не работала для меня. Мне всегда приходилось использовать веб-прокси по умолчанию и устанавливать там URL-адрес или создавать совершенно новые пользовательские привязки и устанавливать URL-адрес прокси-сервера в элементе транспорта http.

1 голос
/ 06 октября 2010

Вы пытались использовать сетевой анализатор трафика, чтобы получить больше информации о том, что отправлено и получено вашим клиентом и сервером?Это может помочь вам решить проблему или, по крайней мере, определить основную причину.

...