4

我正在尝试在 ASP.NET MVC 3 中设置一个操作来处​​理mercurial webhook 请求的有效负载 - 在这种情况下,由 Kiln 生成

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

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

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

4

2 回答 2

3

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

public class KilnController : Controller
{

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

    ...
}

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

于 2011-06-17T18:36:15.180 回答
1

事实证明,这IValueProvider并不是我正在寻找的特定的可扩展性——我只需要使用IModelBinder我发现的 James Hughes 提供的快速实现。它需要一些调整来涵盖从表单中拉出一些东西:

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");
    }
于 2011-06-17T18:27:21.030 回答