ASP.NET MVC:基于每个操作或每个路由指定值提供程序?

时间:2011-06-17 18:03:28

标签: json asp.net-mvc-3 webhooks value-provider

我正在尝试在ASP.NET MVC 3中设置一个操作来处​​理mercurial webhook request - in this case, generated by Kiln的有效负载。

有效负载是JSON,但不幸的是,它是作为URL编码的表单值以内容类型application/x-www-form-urlencoded发送的,因为显然使用application/json并且发送它没有编码且没有参数名称会使它太容易而且......标准。

这意味着我不能只使用新的JsonValueProviderFactory,因为它只使用标准的application/json内容类型来获取请求。当然,我不仅可以让工厂同时接收application/x-www-form-urlencoded个请求,因为我需要这些请求在我的应用程序中的其他地方使用表单数据值提供程序,它实际上是接收表单数据而不是JSON。 / p>

那么,有没有办法可以指定ValueProvider或ValueProviderFactory只应用于特定的操作或路由?

2 个答案:

答案 0 :(得分:3)

如果您创建一个特定的控制器来处理这些webhook请求,您可以在实例化控制器时分配唯一的ValueProvider。

public class KilnController : Controller
{

    public KilnController()
    {
        this.ValueProvider = MyCustomValueProvider;
    }

    ...
}

这应满足您对这些请求的自定义ValueProvider的需求。

答案 1 :(得分:1)

事实证明IValueProvider并不是我所寻求的特定的可扩展性 - 我只需要使用我发现courtesy of James Hughes的快速IModelBinder实现。它需要一些调整来覆盖从表单中拉出的东西:

public class JsonFormModelBinder : IModelBinder
{
    #region [ ModelBinder Members ]

    Object IModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        HttpRequestBase request = controllerContext.HttpContext.Request;
        var jsonStringData = request.Form[bindingContext.ModelName];
        if (jsonStringData != null) return JsonConvert.DeserializeObject(jsonStringData, bindingContext.ModelType);
        else return null;
    }

    #endregion
}

用法:

    [HttpPost]        
    public ActionResult WebHook([ModelBinder(typeof(JsonFormModelBinder))] WebHookMessage payload)
    {
        return Content("OK");
    }