【问题标题】:Getting the current MediaTypeFormatter from the Request object, possible?从 Request 对象中获取当前的 MediaTypeFormatter,可能吗?
【发布时间】:2014-02-19 18:13:00
【问题描述】:

我想从请求对象中获取 MediaTypeFormatter,这可能吗?

所以如果请求以

的形式出现
    application/json 

然后我想获取 MediaTypeFormatter,在这种情况下,它应该是 JsonMediaTypeFormatter。

我需要这样做的原因是我的 api 方法可以同时支持 MediaTypeFormatter(即 XML 和 JSON)。

我正在返回一个 HttpResponseMessage 并将内容设置为 ObjectContent,并且我需要传入媒体类型格式化程序,如果我将此值硬编码为 json,那么它将不支持 xml。

有人做过这样的事吗?

提前致谢

【问题讨论】:

  • Web API 框架会根据请求中发送的 Accept 标头自动处理选择正确的 MediaTypeFormatter。除非您正在做一些特殊的事情,否则您无需担心在 API 方法中设置响应内容类型。让框架处理它;这就是它的设计目的。请参阅@Badri 的回答。

标签: asp.net-web-api json.net asp.net-web-api2


【解决方案1】:

您应该使用Request.CreateResponse 方法。不要试图根据媒体类型找出格式化程序。 ASP.NET Web API 为您进行内容协商。如果请求带有质量因素和东西怎么办?编写所有这些逻辑会变得很复杂,并且已经在框架代码中完成。您所要做的就是使用这样的方法 - Request.CreateResponse(HttpStatusCode.OK, product); 并返回响应对象,而不是自己设置 ObjectContent。根据从 conneg 中选择的格式化程序,您的对象将被序列化。或者,您是否有无法使用它的特定场景?

【讨论】:

  • 假设我有一个返回类型为 HttpResponseMessage 的控制器操作。在控制器操作中,我使用一个接口实例,其方法签名为“object GetStuff()”,以将值存储在“object stuff”中。我的实例有“public object GetStuff() { return new List(); }”。如果我随后调用 Request.CreateResponse(stuff),响应会因“application/xml”而爆炸,因为 XML 序列化程序无法处理 typeof(object)。如果我改为说“var content = ObjectContent(foo.GetType(), foo, new XmlMediaTypeFormatter()) 那么它工作得很好。建议?
  • 我会回复我自己的评论 - 我最终编写了额外的“HttpResponseMessage CreateResponse(this HttpRequestMessage request)”扩展方法。我从方法签名中删除了通用 ,并采用了“对象值”而不是“T 值”的参数。如果我扔进任何东西,但严格来说是一个对象,它将进入框架的方法。如果它达到我的扩展方法之一,那么我检查该值是否为空。如果没有,我使用 value.GetType() 创建一个新的 ObjectContent() 实例。如果为null,我只是将内容设置为null。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 2023-03-13
  • 2011-01-06
相关资源
最近更新 更多