发送“415不支持的媒体类型”时指定支持的媒体类型

时间:2010-07-27 11:36:05

标签: http rest http-status-codes httpresponse content-negotiation

如果客户端将不支持的媒体类型的数据发送到HTTP服务器,则服务器将回答状态为“415 unsupported media type”。但是如何告诉客户端支持哪些媒体类型?是否有标准或至少推荐的方法?或者它只是作为文本写入响应主体?

4 个答案:

答案 0 :(得分:8)

在这种情况下,没有任何规范要做什么,所以期望实现遍布整个地方。 (如果服务器的响应包含类似Accept:标题的内容,那将是明智的,因为如果当前方向错误,那么它具有非常正确的语义。)

答案 1 :(得分:0)

我相信你可以用OPTIONS Http动词来做到这一点。

如果您的方案适合某个用例,也可以使用300 Multiple Choices的状态代码。如果他们发送的Accept标头为application/xml且您只支持text/plain且该表示位于不同的网址,那么您可以使用300并在位置标头中回复该网址那种表述。我意识到这可能不完全适合你的问题,但这是另一种可能的选择。

来自HTTP规范:

10.4.7 406不可接受

请求标识的资源只能生成响应实体,这些响应实体的内容特征根据请求中发送的接受标头不可接受。

除非是HEAD请求,否则响应应该包括一个实体,其中包含可用实体特征和位置的列表,用户或用户代理可以从中选择最合适的实体特征和位置。实体格式由Content-Type头字段中给出的媒体类型指定。根据用户代理的格式和功能,可以自动选择最合适的选择。但是,本规范没有为此类自动选择定义任何标准。

      Note: HTTP/1.1 servers are allowed to return responses which are
      not acceptable according to the accept headers sent in the
      request. In some cases, this may even be preferable to sending a
      406 response. User agents are encouraged to inspect the headers of
      an incoming response to determine if it is acceptable.

答案 2 :(得分:0)

TL;博士; 编辑生成的代理类以继承Microsoft.Web.Services3.WebServicesClientProtocol **。

我在排除此错误时遇到了这个问题,所以我想我会帮助下一个可能来到这里的人,虽然不确定它是否回答了所述的问题。我遇到了这个错误,在某些时候我不得不接管使用WSE和MTOM编码的现有解决方案。这是一个调用Web服务的Windows客户端。

到目前为止,客户端正在调用Web服务,它会抛出该错误。 有助于解决该错误的一点是检查显然默认生成的Web服务代理类是从System.Web.Services.Protocols.SoapHttpClientProtocol继承的。 基本上这意味着它实际上并没有使用WSE3。

无论如何我手动编辑了代理并将其更改为继承自Microsoft.Web.Services3.WebServicesClientProtocol

BTW,要查看VS中生成的代理类,请单击Web引用,然后单击“显示所有文件”工具栏按钮。 reference.cs是欢乐的地方!

希望它有所帮助。

答案 3 :(得分:-3)

在第81页的“HTTP Developer's Handbook”一书中,Chris Shiflett解释了415的含义,然后他说,“HTTP响应内容中使用的媒体类型应该在Content-Type实体标题中指出。 “

1)Content-Type也是可能的答案吗?它可能是以逗号分隔的已接受内容​​类型列表。这种可能性的明显问题是Content-Type是实体头而不是响应头。

2)或者这是书中的拼写错误?他真的想说“HTTP请求”吗?