内容类型 text/html;响应消息的 charset=UTF-8 与绑定的内容类型不匹配 (text/xml; charset=utf-8)

Posted

技术标签:

【中文标题】内容类型 text/html;响应消息的 charset=UTF-8 与绑定的内容类型不匹配 (text/xml; charset=utf-8)【英文标题】:The content type text/html; charset=UTF-8 of the response message does not match the content type of the binding (text/xml; charset=utf-8) 【发布时间】:2011-07-12 21:34:33 【问题描述】:

我创建了 WCF 服务并使用独立应用程序测试 WCF 客户端。我可以使用 Internet Explorer 查看此服务,也可以在 Visual Studio 服务引用中查看。这是错误消息。

"The content type text/html; charset=UTF-8 of the response message does not match the content type of the binding (text/xml; charset=utf-8)."

您能告诉我哪里出了问题吗?

谢谢。

【问题讨论】:

【参考方案1】:

由于返回的内容类型是text/html,我怀疑您的调用会导致 WCF 之外的服务器端错误(您收到的是 HTML 错误页面)。

尝试使用 Web 调试代理(例如 Fiddler)查看响应。


(根据 cmets 编辑):

根据您的 cmets,我发现您的 WCF 托管在 Sharepoint 2010 下,位于经过表单验证的站点中。

您收到的错误是由于您的 WCF 客户端未通过 sharepoint 进行身份验证 - 它没有有效的身份验证 cookie。 Sharepoint 然后返回一个 HTTP 重定向到一个 html 页面(login.aspx 页面);这是您的 WCF 客户端所不期望的。

要更进一步,您必须从 Sharepoint 获取身份验证 cookie(请参阅 Authentication Web Service)并将其传递给您的 WCF 客户端。


(更新编辑):

错误:该网站正在使用基于声明的身份验证。

虽然这不一定是由于 cookie 或表单身份验证,但提供的错误消息的解释保持不变。身份验证问题导致重定向到 WCF 客户端不处理的 HTML 页面。

【讨论】:

抱歉,我花了这么长时间才解决这个问题。谢谢回复。这是来自 Fiddler 的一些数据。 这是来自 Fiddler 的一些数据头。 GET /_vti_bin/psi/helloservice.svc HTTP/1.1 内容类型:文本/xml; charset=utf-8 MicrosoftSharePointTeamServices:14.0.0.4762 服务器:Microsoft-IIS/7.5 X-AspNet-Version:2.0.50727 X-SharePointHealthScore:4 @nav100:尝试运行您的应用程序并在 Fiddler 运行时重现所述错误。您可能需要修改 WCF 客户端端点和配置,以便 WCF 通过 Fiddler 进行连接。 如何通过 Fiddler 进行连接?我输入了server/pwa/_vti_bin/psi/helloservice.svc Fiddler RequestHeader。我得到了同样的信息。 @nav100:如果您在 fiddler 中看到过调用,那么您就可以了。您粘贴的标题报告了Content-Typetext/xml;这是我们所期望的。在这些电话中,您是否收到了您在问题中陈述的例外情况?如果没有,你能设法复制它吗?请注意,它们可能是 fiddler 中 WCF 调用的多行。寻找text/html返回的内容类型并检查内容以获取更多线索。【参考方案2】:

这可能会有所帮助,请检查 ISS 7 中的 url 重写规则。如果您没有正确配置规则,则会出现此问题。

【讨论】:

这是我的问题。我正在将对我的 http wcf 服务的调用重定向到 https 版本。问题(我在 Fiddler 中注意到)是我的服务调用正在接收一个 html 页面,其中包含指向 URL 重写重定向到的 URL 的链接 - 因此接收的是 html 而不是预期的 XML。【参考方案3】:

听起来您的应用程序需要 XML,但接收的是纯文本。你传入的是什么类型的对象?

【讨论】:

【参考方案4】:

text/html 是 SOAP 1.1 标头和 Content-Type: application/soap+xml 是 SOAP 1.2 验证您的绑定并返回标头。 它应该与 1.1 或 1.2 相同

【讨论】:

【参考方案5】:

将以下代码添加到 web.config 服务器项目

<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="basicHttpBinding_IService">
      <security mode="Transport">
        <transport clientCredentialType="None" proxyCredentialType="None"/>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

<services>
  <service name="Service">
    <endpoint address="" name="BasicHttpBinding_IService"
              binding="basicHttpBinding"
              bindingConfiguration="basicHttpBinding_IService"
              contract="IService" />
  </service>

然后更新客户端web服务,更新后对web.config进行如下修改

<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_IService">
      <security mode="Transport" />
    </binding>
  </basicHttpBinding>
</bindings>


  <endpoint address="https://www.mywebsite.com/Service.svc"
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService"
    contract="Service.IService" name="BasicHttpBinding_IService" />

希望对你有用

【讨论】:

以上是关于内容类型 text/html;响应消息的 charset=UTF-8 与绑定的内容类型不匹配 (text/xml; charset=utf-8)的主要内容,如果未能解决你的问题,请参考以下文章

Wcf 服务,我收到此错误:内容类型 text/html;字符集=utf-8

Firefox 避免缓存响应?

SpringCloud OpenFeign:使用内容类型为 text/html 的响应

表单提交返回内容类型为 application/json 而不是 text/html 的响应

Rails 3 原型渲染:更新响应具有 text/html 内容类型

如何为内容类型的响应正文提供示例值:Swagger 中的 text/html(使用 dredd 进行测试)