【问题标题】:How to force controller/action to use JsonValueProvider如何强制控制器/动作使用 JsonValueProvider
【发布时间】:2012-02-20 14:28:15
【问题描述】:

美好的一天!

我正在使用内置 JsonValueProvider 的 ASP.NET MVC 3。

问题是它只有在指定Content-Type: application/json 时才有效。

我正在构建一个 API,其中 JSON 是唯一受支持的格式,我不想强​​制客户端设置此标头。

有没有办法强制控制器/动作使用特定的 ValueProvider?

【问题讨论】:

  • 我知道这不是一个真正的答案,但说几个月后有人说,'哦,我可以得到 XML 的结果',那么你将不得不说不(走开)!!可能值得让它更加灵活并对其他格式开放。 (然后你的问题就会自动消失)
  • 我真的很喜欢支持最广泛的格式(至少有可能这样做),但是我的 API 的 70% 的消费者设置内容类型标头可能是个问题。
  • 我明白你的意思,这一定很烦人!对他们说,“喂,如果你不能设置内容类型的标头,那么到底用 API 做什么??” ;-)
  • 这不是程序员的限制,而是他们使用的平台的限制。但我会调查自己这是否真的是一个问题。 :)

标签: asp.net json asp.net-mvc-3


【解决方案1】:

如果我误解了这个问题,我很抱歉,但这不是您需要做的:

Response.ContentType = "application/json"

您可以创建一个操作过滤器/属性以避免在多个操作中重复此行。

【讨论】:

  • 不,关于传入请求的问题——我想强制 ASP.NET 将请求解释为 JSON 编码。
【解决方案2】:

虽然这很有效并且非常简单,但它似乎更像是一种 hack。您可以做的是创建一个派生自 AuthorizeAttribute 的属性,并在 OnAuthorization 中将 Content-Type 设置为 application/json。

public class JsonActionAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        filterContext.HttpContext.Request.ContentType = "application/json";
    }
}

[JsonAction]
public ActionResult JsonOnlyAction(string var1, int var2, ...)
{
    ...
}

此属性也可以应用于控制器级别。

最初我尝试在操作过滤器中设置 Content-Type,但问题是 OnActionExecuting 发生在 选择值提供程序之后,因此设置内容类型为时已晚。

OnAuthorization 发生在 值提供者被选择之前,并且由于JsonValueProviderFactory 检查Request.ContentType.StartsWith("application/json"),这将确保它被选中。

【讨论】:

  • 不错的技巧,如果有人没有提出更多面向框架的方法,我会将其标记为答案。
猜你喜欢
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
相关资源
最近更新 更多