Клиент Windows WCF с Internet proxy server показывает ошибку сервер совершил нарушение протокола. Section=ResponseStatusLine

наша команда пытается создать приложение windows (C#) для вызова службы WCF с помощью прокси-сервера интернета

показывать исключение " сервер совершил нарушение протокола. Раздел=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";
}

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

at Система.Средство servicemodel.Каналы.HttpChannelUtilities.ProcessGetResponseWebException (WebException webException, HttpWebRequest запрос, HttpAbortReason abortReason)
на ServiceModel.Каналы.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply (TimeSpan timeout)
в системе.Средство servicemodel.Каналы.RequestChannel.Запрос (сообщение, TimeSpan timeout)
в системе.Средство servicemodel.Диспетчер.RequestChannelBinder.Запрос (сообщение сообщение, TimeSpan тайм-аут)
в системе.Средство servicemodel.Каналы.ServiceChannel.Вызов (строковое действие, Boolean oneway, Операция ProxyOperationRuntime, Object[] ins, Object[] outs, TimeSpan timeout)
в системе.Средство servicemodel.Каналы.ServiceChannel.Вызов (строковое действие, Boolean oneway, Операция ProxyOperationRuntime, Object[] ins, Object[] outs)
в системе.Средство servicemodel.Каналы.ServiceChannelProxy.InvokeService (IMethodCallMessage methodCall, операция ProxyOperationRuntime)
в системе.Средство servicemodel.Каналы.ServiceChannelProxy.Invoke (сообщение IMessage)

исключение перестроено в [0]:
в системе.Во время выполнения.Удаленное взаимодействие.Полномочия.Объекта realproxy.HandleReturnMessage (IMessage reqMsg, IMessage retMsg)
в системе.Во время выполнения.Удаленное взаимодействие.Полномочия.Объекта realproxy.PrivateInvoke (MessageData& msgData, тип Int32)
в DevicesService.IDevicesService.CheckNetworkConnection (строка ipAddress)

мой клиентский код приложение.конфиг alt text

мой серверный код в интернете.конфиг alt text

6 ответов


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


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

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


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

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

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

  1. измените servicebehavior на add <serviceMetadata httpGetEnabled = "true"/> затем измените параметр прокси в IE и перейдите к url-адресу службы и посмотрите, можете ли вы получить страницу WSDL.
  2. сделайте выше с SoapUI и посмотреть, есть ли какие-либо ошибки. Если WSDL доступен, создайте прокси-сервер и вызовите операцию для проверки ошибок.
  3. включить трассировку WCF, как описано здесь. В tracelogs очень подробно, и я диагностировал многие проблемы WCF, используя эту технику.
  4. наконец попробуйте трассировку сети с помощью помощью Wireshark.

код для вызова службы 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;

            }

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