Странное поведение службы WCF

#wcf #network-protocols #protocolexception

#wcf #сетевые протоколы #исключение protocolexception

Вопрос:

Я использую службу wsHttpBinding, которая с этого момента работает идеально. Мое приложение WPF (клиент) подключено к нему и автоматически получает информацию с сервера каждые 15 секунд.

Я замечал, что иногда (время от времени, в некоторые дни проблем нет) мой клиент получает следующее исключение:

 System.ServiceModel.ProtocolException: The content type text/html; charset=utf-8 of the response message does not match the content type of the binding (application/soap xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 1024 bytes of the response were: '<html>
    <head>
        <title>  </title>
        <script type="text/javascript">
        function bredir(d,u,r,v,c){var w,h,wd,hd,bi;var b=false;var p=false;var s=[[300,250,false],[250,250,false],[240,400,false],[336,280,false],[180,150,false],[468,60,false],[234,60,false],[88,31,false],[120,90,false],[120,60,false],[120,240,false],[125,125,false],[728,90,false],[160,600,false],[120,600,false],[300,600,false],[300,125,false],[530,300,false],[190,200,false],[470,250,false],[720,300,true],[500,350,true],[550,480,true]];if(typeof(window.innerHeight)=='number'){h=window.innerHeight;w=window.innerWidth;}else if(typeof(document.body.offsetHeight)=='number'){h=document.body.offsetHeight;w=document.body.offsetWidth;}for(var i=0;i<s.length;i  ){bi=s[i];wd=Math.abs(w-bi[0]);hd=Math.abs(h-bi[1]);if(wd<=2amp;amp;hd<=2){b=true;p=bi[2];}}if(b||(w<100amp;amp;w!==0)||(h<100amp;amp;h!==0)){if(pamp;amp;self==parent){self.close();return;}return'/b' 'anner.php?w=' w 'amp;h=' h 'amp;d=' d 'amp;u=' u 'amp;r=' r 'amp;view=' v;}else{return c;}}
        </script>
    </head>
    <body onLoad="window.l'.

Server stack trace: 
   at System.ServiceModel.Channels.HttpChannelUtilities.ValidateRequestReplyResponse(HttpWebRequest request, HttpWebResponse response, HttpChannelFactory factory, WebException responseException, ChannelBinding channelBinding)
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
   at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.ClientReliableChannelBinder`1.RequestClientReliableChannelBinder`1.OnRequest(TRequestChannel channel, Message message, TimeSpan timeout, MaskingMode maskingMode)
   at System.ServiceModel.Channels.ClientReliableChannelBinder`1.Request(Message message, TimeSpan timeout, MaskingMode maskingMode)
   at System.ServiceModel.Security.SecuritySessionClientSettings`1.SecurityRequestSessionChannel.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
  

Есть ли у вас какие-либо идеи о том, как решить эту проблему?

Спасибо, Камилла.

Комментарии:

1. не уверен, почему у вас есть этот html в полезной нагрузке ur. Я бы посоветовал посмотреть, не можете ли вы закодировать полезную нагрузку xml.

Ответ №1:

Я предполагаю, что иногда у службы, к которой вы подключаетесь, возникает проблема, и она отвечает страницей с ошибкой html. Возможно, страница 404 не найдена, служба 503 недоступна или внутренняя ошибка сервера 500.

Комментарии:

1. все в порядке.. но как я могу это отладить? Я ограничен здесь первыми 1024 байтами и не могу получить больше со стороны клиента (WPF)…

2. Извините за поздний ответ. Я бы, вероятно, начал использовать что-то вроде Fiddler для отслеживания http-запросов и ответов. В ответе вы увидите HTML-страницу, возвращаемую, скорее всего, при возникновении проблемы. Такой инструмент, как Fiddler, полезен, потому что он будет исследовать ответ до того, как он будет передан вашему приложению.

Ответ №2:

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

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

Я надеюсь, что это поможет.

Приветствую, Вагнер.

Комментарии:

1. к сожалению, сохранение сеанса безопасности является обязательным для меня. Я не смогу повторно создать соединение, не потеряв свои методы аутентификации (и выбор лицензии).

2. Возможно, вам удастся кэшировать объект ClientCredentials и передать его обратно новому клиенту после восстановления соединения.