2011-05-11 3 views
0

J'utilise un service wsHttpBinding qui fonctionne parfaitement depuis maintenant. Mon application WPF (client) y est connectée et reçoit automatiquement les informations du serveur toutes les 15 secondes.WCF Weird Service Behavior

J'ai remarqué que parfois (de temps en temps, quelques jours il n'y a pas de problème) mon client reçoit l'exception suivante:

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) 

Auriez-vous une idée sur l'endroit où résoudre ce problème?

Merci, Camille.

+0

Vous ne savez pas pourquoi vous avez ce html dans votre charge utile. Je suggère de voir si vous ne pouvez pas encoder la charge utile xml. – Perpetualcoder

Répondre

0

Cela semble être lié à la négociation de sécurité. Il y a une chance que votre contexte de sécurité soit mis en cache - donc quand la session expire, le contexte de sécurité n'est plus valide, mais il essaie toujours de le transmettre. Vous devrez peut-être vérifier cela et que vous fermez votre connexion à chaque fois. Et vous pourriez finir par avoir à implémenter une routine de réessai (votre code client pour attraper cette exception de communication et quand cela se produit jeter l'objet client actuel loin et en créer un nouveau (quelque chose comme une nouvelle tentative). cela dans un de mes clients.

J'espère que cette aide.

Cheers, Wagner.

+0

malheureusement, garder la session de sécurité est un must pour moi. Je ne serai pas en mesure de recréer la connexion sans perdre mes méthodes d'authentification (et la sélection de licence). – user658664

+0

Vous pouvez mettre en cache l'objet ClientCredentials et le renvoyer au nouveau client une fois que vous avez recréé la connexion. –

1

Je devine que de temps en temps le service que vous connectez a un problème et répond avec une page d'erreur html Cela peut être une erreur 404 Page introuvable ou 503 non disponible ou une erreur interne du serveur 500.

+0

tout droit .. mais comment puis-je déboguer cela? Je suis limité aux 1024 premiers octets ici, et ne peux pas obtenir plus du côté du client (WPF) ... – user658664

+0

Désolé pour le retard de ma réponse. Je commencerais probablement à utiliser quelque chose comme [Fiddler] (http://www.fiddler2.com/) pour renifler les requêtes et réponses http. Dans la réponse, vous verrez une page HTML retournée lorsque vous avez un problème le plus probable. Un outil comme Fiddler est utile car il va enquêter sur la réponse avant qu'elle ne soit transmise à votre application. –