WCF服务客户端:内容类型text/html;响应消息的charset=utf-8 与绑定的内容类型不匹配
Posted
技术标签:
【中文标题】WCF服务客户端:内容类型text/html;响应消息的charset=utf-8 与绑定的内容类型不匹配【英文标题】:WCF Service Client: The content type text/html; charset=utf-8 of the response message does not match the content type of the binding 【发布时间】:2011-07-11 18:20:46 【问题描述】:我的本地 IIS 服务器上运行了 WCF 服务。我已将它添加为对 C# 网站项目的服务引用,它可以很好地添加并自动生成代理类。
但是,当我尝试调用任何服务合同时,我收到以下错误:
说明:在执行过程中发生未处理的异常 执行当前的 Web 请求。 请查看堆栈跟踪以获取更多信息 有关错误和位置的信息 它起源于代码。
异常详情: System.ServiceModel.ProtocolException: 内容类型 text/html; 响应消息的charset=utf-8 与内容类型不匹配 绑定(应用程序/soap+xml; 字符集=utf-8)。如果使用自定义 编码器,请确保 IsContentTypeSupported 方法是 正确实施。第一个 1024 响应的字节数是:' 功能 bredir(d,u,r,v,c)var w,h,wd,hd,bi;var b=false;var p=false;var s=[[300,250,假],[250,250,假],[240,400,假],[336,280,假],[180,150,假],[468,60,假],[234,60,假],[ 88,31,假],[120,90,假],[120,60,假],[120,240,假],[125,125,假],[728,90,假],[160,600,假],[ 120,600,假],[300,600,假],[300,125,假],[530,300,假],[190,200,假],[470,250,假],[720,300,真],[500,350,真],[550,480, true]];if(typeof(window.innerHeight)=='number')h=window.innerHeight;w=window.innerWidth;否则 if(typeof(document.body.offsetHeight)=='number')h=document.body.offsetHeight;w=document.body.offsetWidth;for(var 我=0;我
我还有一个控制台应用程序,它也与 WCF 服务通信,并且控制台应用程序能够很好地调用方法而不会出现此错误。
以下是我的配置文件的摘录。
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>
网站项目服务客户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>
这是我第一次尝试创建 WCF,所以它是全新的。非常感谢任何帮助。
【问题讨论】:
您如何托管此服务?在 IIS 中?如果是这样,那么 IIS 规定了服务地址 - 您不能定义自己的基地址(它们不被使用)。因此,如果您在 IIS 中,地址将是http://yourserver/virtualdirectory/ScrapperService.svc
。您可以在 Visual Studio 的解决方案资源管理器中对 *.svc 文件执行“在浏览器中查看”吗??
我尝试从 IIS 服务器查看服务,但它返回了 DNS 错误。结果发现该服务仅在内部可见,因此当我的客户尝试访问该服务时,它不能。一切顺利,谢谢!
【参考方案1】:
我遇到了类似的问题。我通过更改解决了它
<basicHttpBinding>
到
<basicHttpsBinding>
并且还将我的 URL 更改为使用 https:// 而不是 http://。
同样在
binding="basicHttpBinding"
到
binding="basicHttpsBinding"
这行得通。
【讨论】:
这是给我的。提供程序从 HTTP 切换到 HTTPS。 那是我的问题,https而不是http。 这个答案为我省去了很多麻烦。我必须使用接受绑定对象的 SoapClient 构造函数并使用 BasicHttpsBinding 的实例。永远也想不通。 我也一样 - 谢谢 - 还必须从 HttpTransportBindingElement 更改为 HttpsTransportBindingElement 我认为当您在仅 HTTP 负载均衡器后面点击服务时会出现问题?【参考方案2】:尝试在托管服务的服务器上的 Web 浏览器中浏览到 http://localhost/ScraperService.svc,使用客户端通常在其下运行的相同 Windows 凭据。
我想 IIS 正在显示一些描述的 html 错误消息,而不是按预期返回 xml。
当您有一个执行互联网过滤的 http 代理服务器时,也会发生这种情况。我对 ContentKeeper 的经验是它拦截任何 http/https 流量并将其作为“非托管内容”阻止 - 我们得到的只是一个 html 错误消息。为避免这种情况,您可以向 Internet Explorer 添加代理服务器例外规则,以便代理不会拦截到您网站的流量:
控制面板 > Internet 选项 > 连接 > LAN 设置 > 高级 > 代理设置
【讨论】:
成功了。我登录服务器并尝试查看服务,但收到 DNS 错误。事实证明,站点仅在内部可见,因此当我的 WCF 客户端尝试访问该服务时,它无法访问并返回错误。感谢您的帮助! 我不使用代理,但这个答案启发我在上一个代理对话框中关闭“自动检测设置”,这有帮助 你是救星!【参考方案3】:来自 Web 服务器的 HTML 响应通常表示已提供错误页面,而不是来自 WCF 服务的响应。我的第一个建议是检查您在其下运行 WCF 客户端的用户是否有权访问该资源。
【讨论】:
我该如何进行测试?在测试期间,WCF 客户端和 WCF 服务都在不同域下的同一 IIS 服务器上运行... WCF 客户端是在 IIS 下运行的 ASP.NET 应用程序吗?如果是这样,这可能会作为具有最低权限的网络服务帐户运行。您需要允许此帐户访问 IIS 中的目录,或者将 WCF 客户端配置为作为不同的 Windows 帐户运行。 如果WCF客户端是soapUI或者WCFStorm这样的客户端测试工具呢?【参考方案4】:您正在尝试使用 wsHttpBind 访问服务,该服务默认使用安全加密消息(安全消息)。 另一方面,netTcpBind 使用安全加密通道。 (安全传输)...但是basicHttpBind,根本不需要任何安全性,并且可以匿名访问
所以。在服务器端,将其添加\更改到您的配置中。
<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>
然后将您的端点更改为
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsbind" name="wshttpbind" contract="WCFService.IService" >
应该可以的。
【讨论】:
【参考方案5】:与许多人一样,在我的情况下,我也因为一个错误而得到这个。可悲的是,我只能阅读 html 错误页面的 CSS。
我的问题的根源也是服务器上的重写规则。它正在将 http 重写为 https。
【讨论】:
【参考方案6】:我尝试了上述所有建议,但最终奏效的是将应用程序池管理的管道从集成模式更改为经典模式。 它在自己的应用程序池中运行——但它是第一个 .NET 4.0 服务——所有其他服务都在使用集成管道模式的 .NET 2.0 上。 它只是一个标准的 WCF 服务,使用的是 https - 但在 Server 2008(不是 R2)上 - 使用 IIS 7(不是 7.5)。
【讨论】:
【参考方案7】:在我的例子中,一个 URL 重写规则弄乱了我的服务名称,它被重写为小写,我收到了这个错误。
确保不要小写 WCF 服务调用。
【讨论】:
【参考方案8】:您可能需要检查服务的配置并确保一切正常。您可以通过浏览器导航到 Web 服务,以查看架构是否会在浏览器上呈现。
您可能还想检查用于调用服务的凭据。
【讨论】:
【参考方案9】:我也遇到过类似的情况,但客户端配置使用的是 basicHttpBinding。问题原来是该服务使用的是 SOAP 1.2,而您不能在 basicHttpBinding 中指定 SOAP 1.2。我修改了客户端配置以改用 customBinding 并且一切正常。以下是我的 customBinding 的详细信息以供参考。我尝试使用的服务是通过 HTTPS 使用 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>
【讨论】:
在哪里可以配置用户名和密码,它显示“未提供用户名。在 ClientCredentials 中指定用户名。”【参考方案10】:即使您不使用网络代理,在代理对话框中打开“自动检测设置”也会关闭此异常。
【讨论】:
【参考方案11】:在我的 WCF 服务项目中,此问题是由于引用 System.Web.Mvc.dll 的不同版本所致。所以可能是DLL不同版本的兼容性问题
当我使用时
System.Web.Mvc.dll 版本 5.2.2.0 -> 它会抛出 错误 内容类型 text/html;响应消息的charset=utf-8
但是当我使用 System.Web.Mvc.dll 4.0.0.0 或更低版本 -> 工作正常。
我不知道不同版本 DLL 问题的原因,但通过更改 DLL 的版本,它对我有用。
当您在 WCF 项目中添加其他项目的引用并且此引用项目具有不同版本的 System.Web.Mvc DLL 或可能是任何其他 DLL 时,甚至会生成此错误。
【讨论】:
【参考方案12】:注意:如果您的目标服务器端点使用安全套接字层 (SSL) 证书
将您的 .config 设置从 basicHttpBinding
更改为 basicHttpsBinding
我相信,它会解决你的问题。
【讨论】:
【参考方案13】:X++
binding = endPoint.get_Binding();
binding.set_UseDefaultWebProxy(false);
【讨论】:
这是你的答案,如果是,请解释它是如何解决问题的。 有时我们的程序由于某些未知原因未能找到代理服务器,在这种情况下不要使用默认代理并在代码中设置代理的IP地址。这样它就会开始工作了【参考方案14】:如果您同时使用 wshttpbinding 和 https 请求,那么我通过使用以下配置更改来解决它。
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="None" />
<message clientCredentialType="Certificate" />
</security>
【讨论】:
【参考方案15】:嘿, 就我而言,出现此错误是因为 Web 服务的应用程序池的 32/64 位设置错误。所以这个错误需要下面的修复:你去 IIS,选择 webservice 的站点,去高级设置并获取应用程序池。然后转到应用程序池,选择它,转到“高级设置...”,选择“启用 32 位应用程序”并根据您的 Web 服务的 32/64 位类型将其启用或禁用。 如果设置为 True,则意味着它只允许 32 位应用程序,因此对于 64 位应用程序,您必须将其设为“禁用”(默认)。
【讨论】:
【参考方案16】:对我来说,这是指向错误数据库服务器的网络应用程序连接字符串。
【讨论】:
【参考方案17】:在我的情况下,这是因为我的 WCF web.config 的第一行有一个返回字符。更令人沮丧的是,它位于负载均衡器后面,并且只发生了一半(两个 web.config 中只有一个有这个问题)。
【讨论】:
这很有趣 tbh【参考方案18】:我在我的 asp.net core 5 web api 项目中遇到了类似的问题来调用肥皂服务。我通过以下方式解决了它:
1.更改其网址:return new System.ServiceModel.EndpointAddress("http://ourservice.com/webservices/service1.asmx?wsdl");到 https://ourservice.com/...
-
在其 Reference.cs 中使用这些配置:
私有静态 System.ServiceModel.Channels.Binding GetBindingForEndpoint(EndpointConfiguration endpointConfiguration) if ((endpointConfiguration == EndpointConfiguration.TaxReturnSoap)) System.ServiceModel.BasicHttpsBinding 结果 = 新 System.ServiceModel.BasicHttpsBinding(); 结果.TextEncoding = System.Text.Encoding.UTF8; 结果.MaxBufferSize = int.MaxValue; result.ReaderQuotas = System.Xml.XmlDictionaryReaderQuotas.Max; 结果.MaxReceivedMessageSize = int.MaxValue; 结果.AllowCookies = true; 返回结果; if ((endpointConfiguration == EndpointConfiguration.TaxReturnSoap12)) System.ServiceModel.Channels.CustomBinding 结果 = new System.ServiceModel.Channels.CustomBinding(); System.ServiceModel.Channels.TextMessageEncodingBindingElement textBindingElement = new System.ServiceModel.Channels.TextMessageEncodingBindingElement(); textBindingElement.WriteEncoding = System.Text.Encoding.UTF8; textBindingElement.MessageVersion = System.ServiceModel.Channels.MessageVersion.CreateVersion(System.ServiceModel.EnvelopeVersion.Soap12, System.ServiceModel.Channels.AddressingVersion.None); 结果.Elements.Add(textBindingElement); System.ServiceModel.Channels.HttpsTransportBindingElement httpBindingElement = new System.ServiceModel.Channels.HttpsTransportBindingElement(); httpBindingElement.AllowCookies = true; httpBindingElement.MaxBufferSize = int.MaxValue; httpBindingElement.MaxReceivedMessageSize = int.MaxValue; 结果.Elements.Add(httpBindingElement); 返回结果; throw new System.InvalidOperationException(string.Format("找不到名称为'0'的端点。", endpointConfiguration));
【讨论】:
【参考方案19】:在以下情况下也会发生此错误:
targetNamespace
在 wsdl 中定义错误
要么
当 ns2 在响应中被错误定义时(与请求中的 ns 不同)。例如
请求
<.. xmlns:des="http://zef/">
回复
<ns2:authenticateResponse xmlns:ns2="http://xyz/">
【讨论】:
【参考方案20】:我通过在 web.config 中设置 UseCookies 解决了这个问题。
<system.web>
<sessionState cookieless="UseCookies" />
并设置 enableVersionHeader
<system.web>
<httpRuntime targetFramework="4.5.1" enableVersionHeader="false" executionTimeout="1200" shutdownTimeout="1200" maxRequestLength="103424" />
【讨论】:
【参考方案21】:对我来说,当我在 Web.config 中注释以下行时,问题已解决
<httpErrors errorMode="Detailed" />
【讨论】:
【参考方案22】:我的解决方案相当简单:备份应用程序中的所有内容,卸载它,删除剩余文件夹中的所有内容(但不是文件夹,因此我不必再次授予相同的权限)然后从备份中复制回文件.
【讨论】:
以上是关于WCF服务客户端:内容类型text/html;响应消息的charset=utf-8 与绑定的内容类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章
Wcf 服务,我收到此错误:内容类型 text/html;字符集=utf-8
内容类型 text/html;响应消息的 charset=UTF-8 与绑定的内容类型不匹配 (text/xml; charset=utf-8)