Client de 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 en cours d'exécution sur mon serveur IIS local. Je l'ai ajouté en tant que référence de service à un projet de site web C# et il ajoute bien et génère automatiquement les classes proxy.
Cependant, lorsque j'essaie de l'appeler tout de contrats de service, j'obtiens l'erreur suivante:
Description: une exception non gérée s'est produite pendant exécution de la requête Web en cours. Veuillez consulter la trace de la pile pour en savoir plus informations sur l'erreur et où il d'origine dans le code.
Détails De L'Exception: Système.ServiceModel.ProtocolException: Le type de contenu texte / 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 l'aide personnalisée codeur, assurez-vous que le La méthode IsContentTypeSupported est correctement mis en place. Le premier 1024 octets de la réponse étaient les suivantes: 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)=='nombre'){h=fenêtre.innerHeight;w=window.innerWidth;}else si (typeof (document.corps.offsetHeight)=='nombre'){h=document.corps.offsetHeight; w = document.corps.offsetWidth;}for(var i=0;i
J'ai aussi une application console qui communique également avec le Service WCF et l'application console est capable d'appeler correctement les méthodes sans obtenir cette erreur.
Voici des extraits de mes fichiers de configuration.
WCF Service Web.Configuration:
<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>
Client De Service De Projet De Site Web 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>
Ceci est ma première tentative de création un WCF donc tout est très nouveau. Toute aide est très appréciée.
Merci.
15 réponses
Essayez de naviguer vers http://localhost/ScraperService.svc dans le navigateur web sur le serveur hébergeant le service, en utilisant les mêmes informations d'identification Windows que le client est normalement exécuté.
J'imagine que IIS affiche un message d'erreur html d'une description au lieu de renvoyer xml comme prévu.
Cela peut également se produire lorsque vous avez 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 en tant que "Contenu non géré" - tout ce que nous obtenons 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 LAN > Avancé > Paramètres Proxy
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.
Ce qui se passe, c'est que vous essayez d'accéder au service en utilisant wsHttpBind, qui utilise des messages cryptés sécurisés par défaut (messages sécurisés). D'autre part, netTcpBind utilise des canaux cryptés sécurisés. (Transport Sécurisé)... Mais basicHttpBind, ne nécessite aucune sécurité et peut accéder à anonymous
Donc. Côté Serveur, ajoutez\Change ceci 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 changez votre point de terminaison en
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsbind" name="wshttpbind" contract="WCFService.IService" >
Ça devrait le faire.
, j'ai eu un problème similaire. Je l'ai résolu en changeant
<basicHttpBinding>
À
<basicHttpsBinding>
Et a également changé mon URL pour utiliser https: / / au lieu de http://.
Aussi dans le noeud , modifiez
binding="basicHttpBinding"
À
binding="basicHttpsBinding"
Cela a fonctionné.
Dans mon cas, une règle de réécriture D'URL jouait avec mon nom de service, elle a été réécrite en minuscules et j'obtenais cette erreur.
Assurez-vous de ne pas appeler le service WCF en minuscules.
Comme avec beaucoup, dans ma situation, j'obtenais aussi cela à cause d'une erreur. Et malheureusement, je pouvais juste lire 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. Il réécrivait http en https.
Vous pouvez examiner la configuration de votre service et vous assurer que tout est ok. Vous pouvez accéder au service web via le navigateur pour voir si le schéma sera rendu sur le navigateur.
Vous pouvez également souhaiter examiner les informations d'identification utilisées pour appeler le service.
J'ai essayé toutes les suggestions ci-dessus, mais ce qui a fonctionné à la fin a été de changer le pipeline géré par le Pool D'applications du mode intégré au mode Classique.
Il fonctionne dans son propre pool d'applications-mais c'était le premier service. Net 4.0-tous les autres servicves sont sur. net 2.0 en utilisant le mode pipeline intégré.
C'est juste un service WCF standard utilisant https - mais sur le serveur 2008 (pas R2) - en utilisant IIS 7 (pas 7.5) .
J'ai eu une situation similaire, mais la configuration du client utilisait un basicHttpBinding. Le problème s'est avéré être que le service utilisait SOAP 1.2 et que vous ne pouvez pas spécifier SOAP 1.2 dans un basicHttpBinding. J'ai modifié la configuration du client pour utiliser un customBinding à la place et tout a fonctionné. Voici les détails de mon customBinding pour référence. Le service que j'essayais de consommer était sur HTTPS en utilisant UserNameOverTransport.
<customBinding>
<binding name="myBindingNameHere" sendTimeout="00:03:00">
<security authenticationMode="UserNameOverTransport" includeTimestamp="false">
<secureConversationBootstrap />
</security>
<textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
messageVersion="Soap12" writeEncoding="utf-8">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</textMessageEncoding>
<httpsTransport manualAddressing="false" maxBufferPoolSize="4194304"
maxReceivedMessageSize="4194304" allowCookies="false" authenticationScheme="Basic"
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
keepAliveEnabled="true" maxBufferSize="4194304" proxyAuthenticationScheme="Anonymous"
realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
useDefaultWebProxy="true" requireClientCertificate="false" />
</binding>
</customBinding>
Même si vous n'utilisez pas de proxy réseau, l'activation de "détecter automatiquement les paramètres" dans la boîte de dialogue proxy déclenche cette exception.
Dans mon projet WCF serive ce problème est dû à la référence du système.Web.Mvc.version différente de dll. Il peut donc s'agir d'un problème de compatibilité de la version différente de DLL
Quand j'utilise
Système.Web.Mvc.dll Version 5.2.2.0 - > il thorows L'erreur le type de contenu text / html; charset = utf-8 du message de réponse
Mais quand j'utilise Système.Web.Mvc.dll version 4.0.0.0 ou inférieure -> il fonctionne très bien.
Je ne connais pas la raison de problème de DLL de version différente, mais en changeant la verison de la DLL, cela fonctionne pour moi.
Cette erreur se génère même lorsque vous ajoutez une référence d'un autre projet dans votre projet WCF et que ce projet de référence a une version différente du système.Web.MVC DLL ou pourrait être toute autre DLL.
X++
binding = endPoint.get_Binding();
binding.set_UseDefaultWebProxy(false);
J'ai résolu ce problème en définissant UseCookies dans le web.config.
<system.web>
<sessionState cookieless="UseCookies" />
Et définir enableVersionHeader
<system.web>
<httpRuntime targetFramework="4.5.1" enableVersionHeader="false" executionTimeout="1200" shutdownTimeout="1200" maxRequestLength="103424" />
Si vous utilisez à la fois wshttpbinding avec la requête https, alors je l'ai résolu en utilisant le changement de configuration ci-dessous.
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="None" />
<message clientCredentialType="Certificate" />
</security>
Pour moi, le problème a été résolu lorsque j'ai commenté la ligne suivante dans le Web.config
<httpErrors errorMode="Detailed" />