Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http 发送时指定支持的媒体类型";415不支持的媒体类型;_Http_Rest_Http Status Codes_Httpresponse_Content Negotiation - Fatal编程技术网

Http 发送时指定支持的媒体类型";415不支持的媒体类型;

Http 发送时指定支持的媒体类型";415不支持的媒体类型;,http,rest,http-status-codes,httpresponse,content-negotiation,Http,Rest,Http Status Codes,Httpresponse,Content Negotiation,如果客户端以不受支持的媒体类型向HTTP服务器发送数据,服务器将以状态“”应答。但是,如何告诉客户端支持哪些媒体类型?是否有一个标准或至少一个推荐的方法来做到这一点?还是将其作为文本写入响应体?我相信您可以使用选项Http动词来实现这一点 如果您的场景符合特定用例,也可以使用状态代码300Multiple-chooses。如果他们发送的请求带有application/xml的Accept标题,而您只支持text/plain,并且该表示存在于一个不同的URL中,那么您可以使用300和位置标题中该表

如果客户端以不受支持的媒体类型向HTTP服务器发送数据,服务器将以状态“”应答。但是,如何告诉客户端支持哪些媒体类型?是否有一个标准或至少一个推荐的方法来做到这一点?还是将其作为文本写入响应体?

我相信您可以使用
选项
Http动词来实现这一点

如果您的场景符合特定用例,也可以使用状态代码300
Multiple-chooses
。如果他们发送的请求带有
application/xml
Accept
标题,而您只支持
text/plain
,并且该表示存在于一个不同的URL中,那么您可以使用300和位置标题中该表示的URL进行响应。我知道这可能不完全符合你的问题,但这是另一个可能的选择

从HTTP规范:

10.4.7 406不可接受

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

除非是HEAD请求,否则响应应包括包含可用实体特征和位置列表的实体,用户或用户代理可从中选择最合适的实体。实体格式由内容类型标题字段中给定的媒体类型指定。根据用户代理的格式和能力,可以自动执行最合适的选择。然而,本规范并未定义此类自动选择的任何标准

      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.

在这种情况下,根本没有关于如何操作的规范,所以希望实现无处不在。(如果服务器的响应包含类似于
Accept:
头的内容,那么这才是明智的选择,因为它的语义非常正确,如果当前的方向是错误的)。

在第81页的《HTTP开发者手册》中,Chris Shiflett解释了415的含义,然后他说,“HTTP响应内容中使用的媒体类型应在内容类型实体标头中指明。”

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

2) 或者这是书中的打字错误?他真的想说“HTTP请求”吗; 编辑生成的代理类以从Microsoft.Web.Services3.WebServicesClientProtocol继承

我在排除此错误时遇到了这个问题,所以我想我会帮助下一个可能遇到此问题的人,尽管不确定它是否回答了前面提到的问题。我在某个时候遇到了这个错误,当时我不得不接管一个使用WSE和MTOM编码的现有解决方案。这是一个windows客户端调用网络服务

至此,客户机正在调用web服务,它将在其中抛出该错误。 对我来说,有助于解决该错误的是检查web服务代理类,该类显然是默认情况下从
System.web.Services.Protocols.SoapHttpClientProtocol
继承的。 本质上,这意味着它实际上没有使用WSE3

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

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


希望有帮助。

您希望有一个Accept响应头,但Accept只能用于请求。这是可行的,只是那里没有响应内容的规范。它可能会告诉您,但您怎么知道呢?但是应该使用哪个头来说明支持哪些媒体类型?然后可以在
415
直接响应。通常,
选项
仅用于确定支持哪些方法。
406
与此无关,因为这与响应的类型不匹配有关。
415
是服务器无法处理请求正文中的数据类型时得到的结果。(我刚刚在我正在开发的RESTful Web服务的上下文中处理了这个问题,所以我确信这是正确的解释。)问题是服务器无法处理消息,而客户端已经在发送消息;错误是唯一的可能性(并且没有办法给出一个正确的机器可读方式来说明什么是有效的).
Accept
从服务器到客户端的头将是我要寻找的。我期待HTTP 1.2;-)不,不。“内容类型”始终标识消息的有效负载类型,包括请求和响应(头响应除外…)。