ASP.NET MVC:在每个操作或每个路由的基础上指定值提供程序



我正试图在ASP中设置一个操作。NET MVC 3来处理mercurial webhook请求的有效负载——在本例中,由窑生成。

有效载荷是JSON,但不幸的是,它是以URL编码的形式值发送的,内容类型为application/x-www-form-urlencoded,因为显然使用application/json并在不编码的情况下发送它(没有参数名称)会使它变得太容易,嗯…标准。

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

那么,有没有一种方法可以指定ValueProvider或ValueProviderFactory只用于特定的操作或路线?

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

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

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

事实证明,IValueProvider并不是我想要的特定可扩展性——我只需要使用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");
    }

相关内容

  • 没有找到相关文章

最新更新