HTTP 415 无法处理消息,因为内容类型为 'application/json; charset=utf-8' 不是预期的类型 'text/xml;字符集=utf-8'

Posted

技术标签:

【中文标题】HTTP 415 无法处理消息,因为内容类型为 \'application/json; charset=utf-8\' 不是预期的类型 \'text/xml;字符集=utf-8\'【英文标题】:HTTP 415 Cannot process the message because the content type 'application/json; charset=utf-8' was not the expected type 'text/xml; charset=utf-8'HTTP 415 无法处理消息,因为内容类型为 'application/json; charset=utf-8' 不是预期的类型 'text/xml;字符集=utf-8' 【发布时间】:2014-12-24 20:28:02 【问题描述】:

我们有一个在 HTTPS 上运行良好的 Web 服务,但在 HTTPS 上显示 HTTP 415 错误。因此,在 HTTP 下,我们可以毫无问题地发送和接收 JSON 的 POST 请求。当我们在 HTTPS 下尝试相同的操作时,我们得到了服务期望 text/xml insteas of application/json 的错误。有什么建议去哪里看吗?

如果这很重要,服务器正在使用自签名证书。

更新了绑定和行为

 <!-- Wcf Services Setting -->
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="WsHttpBinding" maxReceivedMessageSize="1048576">
          <readerQuotas maxArrayLength="1048576" />
        </binding>
        <binding name="SecureWsHttpBinding" maxReceivedMessageSize="1048576">
          <readerQuotas maxArrayLength="1048576" />
          <security mode="Transport">
            <transport clientCredentialType="None" />
          </security>
        </binding>
      </wsHttpBinding>
      <webHttpBinding>
        <binding name="WebHttpBinding" maxReceivedMessageSize="1048576">
          <readerQuotas maxArrayLength="1048576" />
        </binding>
        <binding name="SecureWebHttpBinding" maxReceivedMessageSize="1048576">
          <readerQuotas maxArrayLength="1048576" />
          <security mode="Transport">
            <transport clientCredentialType="None" />
          </security>
        </binding>
          <binding name="webBinding">
              <security mode="Transport">
              </security>
          </binding>
      </webHttpBinding>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IMainService" maxReceivedMessageSize="1048576"></binding>
        <binding name="BasicHttpBinding" maxReceivedMessageSize="1048576">
          <readerQuotas maxArrayLength="1048576" />
            <security mode="None">
                <transport clientCredentialType="None" />
            </security>
        </binding>
        <binding name="SecureBasicHttpBinding" maxReceivedMessageSize="1048576">
          <readerQuotas maxArrayLength="1048576" />
          <security mode="Transport">
            <transport clientCredentialType="None" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="AjaxBehavior">
          <webHttp DefaultOutgoingResponseFormat="json" />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="DvaMfs.WcfService">
        <useRequestHeadersForMetadataAddress>
                    <defaultPorts>
                        <add scheme="https" port="443" />
                    </defaultPorts>
                </useRequestHeadersForMetadataAddress>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

服务看起来像这样

<service name="DvaMfs.WcfService.ProductService" behaviorConfiguration="DvaMfs.WcfService">
    <endpoint name="ProductServiceEndPoint" address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding" contract="DvaMfs.WcfService.IProductService" />
    <endpoint name="ProductServiceAjaxEndPoint" address="ajax" binding="webHttpBinding" bindingConfiguration="WebHttpBinding" behaviorConfiguration="AjaxBehavior" contract="DvaMfs.WcfService.IProductService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <endpoint name="ProductServiceSecureEndPoint" address="ProductServiceSecure" binding="basicHttpBinding" bindingConfiguration="SecureBasicHttpBinding" contract="DvaMfs.WcfService.IProductService" />
    <endpoint name="ProductServiceAjaxSecureEndPoint" address="ProductServiceSecureajax" binding="webHttpBinding" bindingConfiguration="SecureWebHttpBinding" behaviorConfiguration="AjaxBehavior" contract="DvaMfs.WcfService.IProductService" />
  </service>

更新 2 这是失败的端点之一:

<endpoint name="DataServiceSecureEndPoint" address="" binding="basicHttpBinding"
bindingConfiguration="SecureBasicHttpBinding" contract="DvaMfs.WcfService.IDataService" />

【问题讨论】:

假设您使用的是 WCF,请提供绑定配置和行为。我认为这是你错误的关键 顺便说一句,我尝试了所有问题的所有建议,但没有任何运气。 @CapitanCavernícola 用部分配置文件更新了问题。 哪些端点失败了? 也许您可以“评论”除“ProductServiceAjaxSecureEndPoint”以外的所有端点,以确保您正在使用它。 【参考方案1】:

WCF 可以有不同的 HTTP 或 HTTPS 端点。 我认为这是问题所在,因此我将其作为“答案”(希望对您有所帮助):

您的 endpoint name="ProductServiceEndPoint" address="" 它在您的基地址中公开。好的

您的 endpoint name="ProductServiceSecureEndPoint" address="ProductServiceSecure" bindingConfiguration="SecureBasicHttpBinding" 它在基础“base_address]/ProductServiceSecure”中公开。

所以这个端点:

端点名称="DataServiceSecureEndPoint" address="" binding="basicHttpBinding" bindingConfiguration="SecureBasicHttpBinding"

不正确,因为地址可能是“ProductServiceSecure”

【讨论】:

这是有道理的,我接受它希望它会在未来帮助其他人解决这个问题。 Saludos ;-)【参考方案2】:

basicHttpBinding 不能与 JSON 一起使用。如果要使用 JSON,请将 basicHttpBinding (SOAP) 更改为 webHttpBinding (REST)。

【讨论】:

那你如何解释相同的代码在 HTTP 上与 JSON 一起工作正常?此问题仅在使用 HTTPS 进行 POST 时发生。我不明白为什么 我会说您正在检查错误的端点,或者对服务的调用没有请求 json,因为 basicHttpBinding 根本不支持 json。 不可能有完全相同的代码,我想你还是在设置代理。如需更多测试:您能否尝试使用“仅” 而不是“”的位置,并评论您未在 HTTPS 中使用的端点?【参考方案3】:

对于这个问题的解决方案是,在你的请求/响应模型中,有一些类默认没有无参数的构造函数。

【讨论】:

【参考方案4】:

最后,我们的后端开发人员更改了端点地址字段并将其路由到特定路径(而不是 address=""),以测试它是否正常工作。显然,根据他的说法,HTTP 和 HTTPS 端点试图使用相同的地址,但这是行不通的。所以他最终注释了 HTTP 端点并设置了 HTTPS 端点的地址。

我不知道这是否有意义,因为我不知道 WCF。对我来说,对 Apache 服务器有所了解,您似乎应该能够指定一个端点,并且它不应该基于/链接到用于连接它的协议。

【讨论】:

【参考方案5】:

configfile 中添加服务标签 名称=“命名空间。服务” 然后在端点标签中

address="" behaviorConfiguration="web" binding="webHttpBinding"
     contract="namespace.IService"

IService界面中

[WebInvoke(Method = "POST", UriTemplate = "functionname", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]

【讨论】:

以上是关于HTTP 415 无法处理消息,因为内容类型为 'application/json; charset=utf-8' 不是预期的类型 'text/xml;字符集=utf-8'的主要内容,如果未能解决你的问题,请参考以下文章

HTTP 状态 415 - 无法使用内容类型

无法处理消息,因为内容类型为 'application/json; charset=utf-8' 不是预期的类型 'text/xml;字符集=utf-8'

无法处理消息,因为内容类型为 'text/xml; charset=utf-8' 不是预期的类型 'application/soap+xml;字符集=utf-8'

Sonos cancelAudioClip API 返回 415 HTTP 响应

无法处理该消息,因为内容类型“应用程序/xml”不是预期的类型“应用程序/soap + xml”;字符集 = utf-8 '

无法处理消息,因为内容类型 'text/xml;charset=UTF-8' 不是预期的类型 'application/soap+xml;字符集=utf-8'