如果客户端向HTTP服务器发送不支持的媒体类型数据,服务器会以状态码"415不支持的媒体类型"进行响应。但是如何告诉客户端支持哪些媒体类型呢?是否存在标准或至少推荐的方法来实现?或者只需将其作为文本写入响应主体中即可?
如果客户端向HTTP服务器发送不支持的媒体类型数据,服务器会以状态码"415不支持的媒体类型"进行响应。但是如何告诉客户端支持哪些媒体类型呢?是否存在标准或至少推荐的方法来实现?或者只需将其作为文本写入响应主体中即可?
在这种情况下,没有任何具体的规范要求该怎么做,因此预计实现方式将千差万别。(如果服务器响应包含类似于Accept:
头信息,那么这是很明智的,因为它基本上具有正确的语义,尽管目前方向不对。)
我相信你可以使用 OPTIONS
Http 动词来完成这个任务。
此外,如果您的情况符合某个特定用例,则可以使用状态码为 300 的 Multiple Choices
。如果他们发送了一个带有 Accept
头部为 application/xml
的请求,而您只支持 text/plain
并且该表示在不同的 URL 上,则可以响应 300 并在 Location 头部中提供该表示的 URL。我知道这可能并不完全符合您的问题,但这是另一种可能的选择。
并且根据 HTTP 规范:
10.4.7 406 Not Acceptable
请求标识的资源仅能生成响应实体,其内容特征不符合请求中发送的 accept 头部所指定的要求。
除非是 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.
415
响应中使用此标题。通常仅使用 OPTIONS
来查找支持的方法。 - deamon简而言之,我编辑了生成的代理类,使其继承自Microsoft.Web.Services3.WebServicesClientProtocol
。
当我遇到这个问题时,我正在解决这个错误,所以我想帮助下一个可能会经过这里的人,虽然不确定它是否回答了所述的问题。我遇到这个错误是因为我不得不接管一个现有的解决方案,该解决方案利用了WSE和MTOM编码。这是一个调用Web服务的Windows客户端。
关键是,客户端在调用Web服务时会抛出该错误。对于帮助我解决这个错误的一些因素是检查Web服务代理类,显然默认生成的代理类继承自System.Web.Services.Protocols.SoapHttpClientProtocol
。本质上意味着它实际上并没有使用WSE3。
无论如何,我手动编辑了代理并将其更改为继承自Microsoft.Web.Services3.WebServicesClientProtocol
。
顺便说一句,在VS中查看生成的代理类,请单击Web引用,然后单击“显示所有文件”工具栏按钮。reference.cs是快乐的地方!
希望能帮到你。