具有多种复杂类型的WebAPI操作,其中一种注入了过滤器

时间:2014-01-17 07:36:19

标签: c# asp.net-web-api

我有一个WebAPI方法如下:

public HttpResponseMessage Post(ITradeCustomerPrincipal user, OrderModel value)

我收到错误

  

无法将多个参数('user'和'value')绑定到请求的内容。

当我试着打电话的时候。我理解为什么。

我有一个全局应用的属性,会将ITradeCustomerPrincipal注入任何操作,如下所示:

public class TradeConsumerFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var matchedArguments = actionContext.ActionDescriptor.ActionBinding.ParameterBindings
                                            .SingleOrDefault(pb => typeof(ITradeCustomerPrincipal).IsAssignableFrom(pb.Descriptor.ParameterType));

        if (matchedArguments != null)
        {
            var TradeCustomerPrincipal = HttpContext.Current.User as ITradeCustomerPrincipal;

            if (TradeCustomerPrincipal != null)
            {
                actionContext.ActionArguments[matchedArguments.Descriptor.ParameterName] = TradeCustomerPrincipal;
            }
        }

        base.OnActionExecuting(actionContext);
    }
}

通过这种方式,动作不需要自己绑定ITradeCustomerPrincipal,它由属性自动完成。

我如何告诉操作不要绑定user参数来自正文(或我猜的任何地方),因为它是事先由动作过滤器设置的?

1 个答案:

答案 0 :(得分:0)

我已经设法通过创建一个什么都不做的模型绑定器并将它应用于user参数来实现这个功能,因为它不是一个分配/创建对象的绑定器。

模型活页夹:

public class NoOpModelBinder : IModelBinder
{
    public bool BindModel(System.Web.Http.Controllers.HttpActionContext actionContext, ModelBindingContext bindingContext)
    {
        return true;
    }
}

新的行动方法签名:

public HttpResponseMessage Post([ModelBinder(typeof(NoOpModelBinder))] ITradeCustomerPrincipal user, OrderModel value)

我已经设法弄清楚如何将模型绑定器全局应用于接口(您不能将该属性应用于接口,只能应用于类):

GlobalConfiguration.Configuration.BindParameter(typeof(ITradeCustomerPrincipal), new NoOpModelBinder());

这意味着此参数的任何操作签名都可以在没有ModelBinder属性的情况下工作。