81 votes

Client du service WCF : Le type de contenu text/html ; charset=utf-8 du message de réponse ne correspond pas au type de contenu de la liaison.

J'ai un service WCF qui fonctionne sur mon serveur IIS local. Je l'ai ajouté comme référence de service à un projet de site Web C# et il s'ajoute bien et génère les classes de proxy automatiquement.

Cependant, lorsque j'essaie d'appeler l'un des contrats de service, j'obtiens l'erreur suivante :

Description : Une exception non gérée s'est produite pendant l'exécution de la requête web en cours. Veuillez consulter la trace de la pile pour plus informations sur l'erreur et son origine l'origine de l'erreur dans le code.

Détails de l'exception : System.ServiceModel.ProtocolException : Le type de contenu text/html ; charset=utf-8 du message de réponse ne correspond pas au type de contenu de la liaison (application/soap+xml ; charset=utf-8). Si vous utilisez un encodeur personnalisé, assurez-vous que la méthode méthode IsContentTypeSupported est correctement implémentée. Les 1024 premiers octets de la réponse étaient : ' fonction 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;}seulement if(typeof(document.body.offsetHeight)=='number'){h=document.body.offsetHeight;w=document.body.offsetWidth;}for(var i=0;i

J'ai également une application console qui communique également avec le service WCF et l'application console est capable d'appeler les méthodes sans obtenir cette erreur.

Voici des extraits de mes fichiers de configuration.

Service WCF Web.Config :

<system.serviceModel>
   <services>
      <service name="ScraperService" behaviorConfiguration="ScraperServiceBehavior">
         <endpoint address=""
                   binding="wsHttpBinding" 
                   bindingConfiguration="WSHttpBinding_IScraperService"
                   contract="IScraperService" />
         <endpoint address="mex" 
                   binding="mexHttpBinding" 
                   contract="IMetadataExchange" />
         <host>
            <baseAddresses>
                <add baseAddress="http://example.com" />
            </baseAddresses>
         </host>
      </service>
   </services>
   <bindings>
       <wsHttpBinding>
           <binding name="WSHttpBinding_IScraperService"
                    bypassProxyOnLocal="false" transactionFlow="false"
                    hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="2000000" maxReceivedMessageSize="2000000"
                    messageEncoding="Text" textEncoding="utf-8"
                    useDefaultWebProxy="true" allowCookies="false">
               <readerQuotas 
                     maxDepth="2000000" maxStringContentLength="2000000" 
                     maxArrayLength="2000000" maxBytesPerRead="2000000"
                     maxNameTableCharCount="2000000" />
               <reliableSession 
                     enabled="false" ordered="true" inactivityTimeout="00:10:00" />
               <security mode="Message">
                   <message clientCredentialType="Windows"
                            negotiateServiceCredential="true"
                            algorithmSuite="Default"
                            establishSecurityContext="true" />
               </security>
            </binding>
          </wsHttpBinding>
      </bindings>
      <behaviors>
          <serviceBehaviors>
              <behavior name="ScraperServiceBehavior">
                  <serviceMetadata httpGetEnabled="true" />
                  <serviceDebug includeExceptionDetailInFaults="true" />
              </behavior>
          </serviceBehaviors>
     </behaviors>
</system.serviceModel>

Site web Projet Service Client Web.Config :

<system.serviceModel>
   <bindings>
      <wsHttpBinding>
          <binding name="WSHttpBinding_IScraperService" 
              closeTimeout="00:01:00" openTimeout="00:01:00" 
              receiveTimeout="00:10:00" sendTimeout="00:01:00"
              bypassProxyOnLocal="false" transactionFlow="false" 
              hostNameComparisonMode="StrongWildcard"
              maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
              messageEncoding="Text" textEncoding="utf-8"
              useDefaultWebProxy="true" allowCookies="false">
              <readerQuotas 
                  maxDepth="32" maxStringContentLength="8192" 
                  maxArrayLength="16384" maxBytesPerRead="4096" 
                  maxNameTableCharCount="16384" />
              <reliableSession enabled="false"
                  ordered="true" inactivityTimeout="00:10:00" />
              <security mode="Message">
                  <transport clientCredentialType="Windows" 
                       proxyCredentialType="None" realm="" />
                  <message clientCredentialType="Windows" 
                       negotiateServiceCredential="true"
                       algorithmSuite="Default" />
              </security>
          </binding>
       </wsHttpBinding>
    </bindings>
<client>
        <endpoint name="WSHttpBinding_IScraperService"
            address="http://example.com/ScraperService.svc"
            binding="wsHttpBinding" 
            bindingConfiguration="WSHttpBinding_IScraperService"
            contract="ScraperService.IScraperService" >
           <identity>
               <servicePrincipalName value="host/FreshNET-II" />
           </identity>
        </endpoint>
     </client>
</system.serviceModel>

C'est ma première tentative de création d'un WCF, donc tout est très nouveau. Toute aide est la bienvenue.

Merci.

1 votes

Comment hébergez-vous ce service ? Dans IIS ? ? Si oui, alors IIS dicte l'adresse du service - vous ne pouvez pas définir vos propres adresses de base (elles ne sont pas utilisées). Donc, si vous êtes dans IIS, l'adresse serait la suivante http://yourserver/virtualdirectory/ScrapperService.svc . Pouvez-vous faire un "View in Browser" sur le fichier *.svc dans l'explorateur de solutions de Visual Studio ?

1 votes

J'ai essayé d'afficher le service à partir du serveur IIS et il a renvoyé une erreur DNS. Il s'est avéré que le service n'était visible qu'en interne et que lorsque mon client a essayé d'accéder au service, il n'a pas pu le faire. Tout est réglé, merci !

30voto

Acentric Points 3356

Essayez de naviguer vers http://localhost/ScraperService.svc dans le navigateur Web du serveur hébergeant le service, en utilisant les mêmes informations d'identification Windows que celles sous lesquelles le client fonctionne normalement.

J'imagine que IIS affiche un message d'erreur en html au lieu de renvoyer du xml comme prévu.

Cela peut également se produire lorsque vous disposez d'un serveur proxy http qui effectue un filtrage Internet. Mon expérience avec ContentKeeper est qu'il intercepte tout trafic http/https et le bloque comme "Contenu non géré" - tout ce que nous obtenons en retour est un message d'erreur html. Pour éviter cela, vous pouvez ajouter des règles d'exception de serveur proxy à Internet Explorer afin que le proxy n'intercepte pas le trafic vers votre site :

Panneau de configuration > Options Internet > Connexions > Paramètres du réseau local > Avancé > Paramètres du proxy

enter image description here

0 votes

Cela a fait l'affaire. Je me suis connecté au serveur et j'ai essayé d'afficher le service et j'ai reçu une erreur DNS. Il s'avère que les sites n'étaient visibles qu'en interne, donc lorsque mon client WCF a essayé d'accéder au service, il n'a pas pu et a renvoyé une erreur. Merci pour votre aide !

0 votes

Je n'utilise pas de proxy, mais cette réponse m'a incité à désactiver l'option "Détection automatique des paramètres" dans la boîte de dialogue précédente du proxy, ce qui m'a aidé.

0 votes

Vous êtes un sauveur !

19voto

DaveRead Points 2572

Une réponse HTML du serveur web indique normalement qu'une page d'erreur a été servie au lieu de la réponse du service WCF. Ma première suggestion serait de vérifier que l'utilisateur sous lequel vous exécutez le client WCF a accès à la ressource.

1 votes

Comment pourrais-je tester cela ? Le client WCF et le service WCF fonctionnent sur le même serveur IIS, mais sous des domaines différents pendant le test...

0 votes

Le client WCF est-il une application ASP.NET fonctionnant sous IIS ? Si c'est le cas, elle sera probablement exécutée sous le compte Network Service, qui dispose de privilèges minimums. Vous devrez soit autoriser ce compte à accéder au répertoire dans IIS, soit configurer le client WCF pour qu'il fonctionne sous un autre compte Windows.

0 votes

Et si le client WCF est un outil de test client comme soapUI ou WCFStorm ?

6voto

mahmoud Points 56

Ce qui se passe, c'est que vous essayez d'accéder au service en utilisant wsHttpBind, qui utilise par défaut des messages cryptés sécurisés (secured Messages). D'autre part, le netTcpBind utilise des canaux cryptés sécurisés. (Secured Transport)... MAIS basicHttpBind, ne nécessite aucune sécurité du tout, et peut accéder à des messages anonymes

SO. Du côté du serveur, ajoutez \Change dans votre configuration.

<bindings>
    <wsHttpBinding>
     <binding name="wsbind"> 
         <security mode="Message">
             <transport clientCredentialType="Windows" proxyCredentialType="None" />
             <message clientCredentialType="Windows" negotiateServiceCredential="true"
                            algorithmSuite="Default" establishSecurityContext="true" />
         </security>
     </binding>
    </wsHttpBinding>
</bindings>

puis ajoutez le changement de votre point de terminaison en

<endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsbind" name="wshttpbind" contract="WCFService.IService" > 

Ça devrait le faire.

2voto

Pedro Points 814

Comme beaucoup, dans ma situation, j'ai également obtenu ce message à cause d'une erreur. Et malheureusement, je n'ai pu lire que le CSS de la page d'erreur html.

La source de mon problème était également une règle de réécriture sur le serveur. Elle réécrivait http en https.

1voto

Valentin Kuzub Points 4349

Dans mon cas, une règle de réécriture d'URL modifiait le nom de mon service, il était réécrit en minuscules et j'obtenais cette erreur.

Assurez-vous que vous ne mettez pas les appels de service WCF en minuscules.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X