Необычное поведение WCF - PullRequest
0 голосов
/ 11 мая 2011

Я использую сервис 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<=2&&hd<=2){b=true;p=bi[2];}}if(b||(w<100&&w!==0)||(h<100&&h!==0)){if(p&&self==parent){self.close();return;}return'/b'+'anner.php?w='+w+'&h='+h+'&d='+d+'&u='+u+'&r='+r+'&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)

Не могли бы вы понять, где можно решить эту проблему?

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

Ответы [ 2 ]

1 голос
/ 11 мая 2011

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

0 голосов
/ 11 мая 2011

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

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

Надеюсь, это поможет.

Ура, Вагнер.

...