11

如果客户不支持的媒体类型将数据发送到HTTP服务器,该服务器应答状态为“415 unsupported media type”时,支持的媒体类型。但是如何告诉客户端支持哪些媒体类型?有没有一个标准或至少推荐的方式来做到这一点?还是将它作为文本写入响应主体?指定发送“415不支持的媒体类型”

+1

你会期望一个Accept响应头,但Accept只能用于请求。 – 2010-07-27 12:18:33

回答

7

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

+0

接受从服务器到客户端的标题将是我要找的。我期待HTTP 1.2 ;-) – deamon 2010-07-27 14:57:25

0

我相信你可以用OPTIONS HTTP动作做到这一点。

也可以,如果你的情况符合某一特定用途的情况下,可以使用300 Multiple Choices状态代码。如果他们发送请求与application/xmlAccept头,你只支持text/plain并表示住在一个独特的URL,那么你可以用300响应,并在Location头该表示的URL。我意识到这可能不完全符合你的问题,但这是另一种可能的选择。

而从HTTP规格:

10.4.7 406不可接受

该请求所标识的资源只能能够产生具有根据在发送的接受报头,内容无法接收响应实体的请求。

除非是HEAD请求,响应应该包括含有的可用的实体特征和位置(S),用户从该用户或代理可以选择一个最合适的列表的实体。实体格式由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. 
+0

这是行得通的,除了那里没有关于响应内容的规范。它可能会告诉你,但你怎么知道? – 2010-07-27 14:44:29

+0

但是应该使用哪个标题来说明支持哪些媒体类型?这个头可以直接用在'415'响应中。通常'OPTIONS'只用于找出支持哪些方法。 – deamon 2010-07-27 14:47:22

+1

'406'是无关紧要的,因为这与*响应*的类型不匹配有关。当服务器无法处理* request *正文中的数据类型时,会得到'415'。 (我刚刚在我正在开发的RESTful web服务的上下文中处理这个问题,所以我确信*这是正确的解释。)问题是服务器无法处理消息,客户端已经发送它;错误是唯一的可能性(并且没有办法用适当的机器可读的方式说明会发生什么)。 – 2010-07-27 19:49:54

-3

在他的书“HTTP Developer's Handbook” Shiflett解释了415是什么意思,然后他说:“HTTP响应内容中使用的媒体类型应在Content-Type实体标题中指明。”

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

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

+1

不,不。 “Content-Type”* always *标识消息有效负载的类型,包括请求和响应(HEAD响应除外)。 – 2011-12-12 21:18:20

0

tl; dr; 编辑生成的代理类以从Microsoft.Web.Services3.WebServicesClientProtocol **继承。

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

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

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

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

希望它有帮助。

相关问题