Клиент 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)
мой клиентский код приложение.конфиг
мой серверный код в интернете.конфиг
6 ответов
Я не видел этого исключения раньше, но у меня уже были большие проблемы, чтобы прокси работал таким образом. Я не знаю, почему, но установка прокси-адреса и использование прокси-сервера по умолчанию для false в BasicHttpBinding никогда не работали для меня. Мне всегда приходилось использовать веб-прокси по умолчанию и устанавливать URL-адрес или создавать новую пользовательскую привязку и устанавливать URL-адрес прокси в элементе привязки транспорта http.
попробуйте проверить заголовки, возвращаемые сервером. Похоже, что искаженные / нестандартные заголовки вызывают это исключение.
похоже, что это что-то вроде исключения catch-all и в результате имеет ограниченную полезность. Искаженные заголовки, попадание в неправильный порт (который возвращает другой отформатированный ответ) и длина содержимого в ответе могут быть причинами исключения. Если это проблема с заголовком, Вы можете сказать клиенту игнорировать небезопасные заголовки (если это надежный источник).
<configuration>
<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing="true" />
</settings>
</system.net>
</configuration>
попробуйте диагностировать этот шаг за раз.
- измените servicebehavior на add
<serviceMetadata httpGetEnabled = "true"/>
затем измените параметр прокси в IE и перейдите к url-адресу службы и посмотрите, можете ли вы получить страницу WSDL. - сделайте выше с SoapUI и посмотреть, есть ли какие-либо ошибки. Если WSDL доступен, создайте прокси-сервер и вызовите операцию для проверки ошибок.
- включить трассировку WCF, как описано здесь. В tracelogs очень подробно, и я диагностировал многие проблемы WCF, используя эту технику.
- наконец попробуйте трассировку сети с помощью помощью 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 для получения дополнительной информации о том, что отправляется и принимается вашим клиентом и сервером? Это может помочь вам решить проблему или, по крайней мере, определить первопричину.