【问题标题】:Why .Net WebApi don't detect the request contentType automatically and do auto-binding?为什么 .Net WebApi 不会自动检测请求 contentType 并进行自动绑定?
【发布时间】:2012-08-09 04:17:10
【问题描述】:

为什么 .Net WebApi 不自动检测请求 contentType 并进行自动绑定?

如果我在未通知 contentType 的情况下发出请求,则会发生 HTTP 500 错误:

No MediaTypeFormatter is available to read an object of type 'ExampleObject' from content with media type ''undefined''.

为什么不尝试检测传入的数据并自动绑定?

另一种情况:

这个请求用Content-Type: application/x-www-form-urlencoded发送一个JSON

User-Agent: Fiddler
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Host: localhost:10329
Content-Length: 42

Request Body:
{"Name":"qq","Email":"ww","Message":"ee"}:

我的 Action 不会在对象参数中自动检测 JSON 请求数据:

public void Create(ExampleObject example) //example is null
{
{

他们为什么不尝试解决它而不是让对象为空?

然后,为了发生绑定,我需要使用Content-Type: application/json 发送。

.Net WebAPI 最好能检测到请求数据的类型并进行自动绑定?为什么不这样呢?

【问题讨论】:

  • 您将内容类型指定为表单,并且希望 asp.net 覆盖它?对我来说,这似乎是一个非常糟糕的设计决定。
  • @SergRogovtsev 而不是让对象为空,为什么他们不尝试解决它?当我没有指定 ContentType 时?
  • 因为这会违反发送者的意图,发送者专门设置数据格式。
  • @SergRogovtsev 但发件人的意图是无论格式如何都发布数据,不是吗?数据格式到头来无所谓,数据要贴出来,这就是本意。
  • 数据格式确实很重要。如果没有,你不应该一开始就指定它。

标签: asp.net asp.net-mvc http rest asp.net-web-api


【解决方案1】:

听起来您想要做的是接受来自服务器的多种格式。

http 的工作方式是客户端向服务器请求资源并告诉服务器它理解的内容类型。这意味着客户端没有得到它无法解码的响应,并且服务器知道哪些响应更适合客户端。例如,如果您是 Web 浏览器,最合适的内容类型是 text/html,但如果您获得 XML,您可能也可以用它做一些事情。因此,您将提出以下请求:

   accept: text/html, application/xml

这说明你更喜欢 html 但也懂 XML

在您的示例中,如果您的客户想要 application/x-www-form-urlencoded 但也可以处理 JSON,那么您应该在发出请求时执行以下操作

 accept: application/x-www-form-urlencoded, application/json

有关更多详细信息,请参阅此处http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html 接受标头的 HTTP 规范

您可能还想创建一个新的媒体类型格式化程序,以便您的服务器知道如何为客户端提供 application/x-www-form-urlencoded,请查看此博客文章以获取有关如何执行此操作的更多信息http://www.strathweb.com/2012/04/rss-atom-mediatypeformatter-for-asp-net-webapi/

【讨论】:

  • 查看问题。我不是在检索数据,而是在发布数据。
  • 在 webapi 中同样的规则适用于 post。唯一的区别是,您无需设置一组接受标头,而是指定一个内容类型标头,该标头告诉服务器已发布数据的类型。如果服务器不知道如何解码数据(即它没有针对内容类型的媒体类型格式化程序)http 表示它应该抛出 400(错误请求)。
【解决方案2】:

application/x-www-form-urlencoded 表示您将以 x-www-form-urlencoded 标准发送数据。无法以其他标准发送数据。

【讨论】:

  • 为什么他们不尝试解决它而不是让对象为空?当我没有指定 ContentType 时?
  • ASP.NET MVC 设计背后的主要理念之一是框架应该遵守“互联网标准”。因此,ASP.NET MVC 基础结构的许多方面都依赖于正确使用元数据(例如 ContentType 和 HTTP 动词)才能正常运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多