我正试图在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");
}