我做了一些搜索,但似乎没有找到任何东西……
使用WebApi,我想将输入参数映射到标题值:例如
例如.在控制器中:
public User GetUser(int id){ ... return user; }
我希望WebApi将id参数映射到标头值(例如X-Auth:1234)…而不是URL参数.
这支持吗?
解决方法
我不认为这是开箱即用的,例如[FromBody]属性.
您似乎应该能够使用模型绑定器来实现此功能,如 here所述.在模型绑定器中,您可以访问请求及其标头,因此您应该能够读取标头并将其值设置为bindingContext.型号属性.
您似乎应该能够使用模型绑定器来实现此功能,如 here所述.在模型绑定器中,您可以访问请求及其标头,因此您应该能够读取标头并将其值设置为bindingContext.型号属性.
编辑:进一步阅读文章,似乎自定义HttpParameterBinding和ParameterBindingAttribute是一个更合适的解决方案,或者至少我会这样做.您可以实现一个通用的[FromHeader]属性来完成这项工作.我也在解决同样的问题,所以一旦我有了解决方案,我就会发布我的解决方案.
编辑2:这是我的实现:
public class FromHeaderBinding : HttpParameterBinding { private string name; public FromHeaderBinding(HttpParameterDescriptor parameter,string headerName) : base(parameter) { if (string.IsNullOrEmpty(headerName)) { throw new ArgumentNullException("headerName"); } this.name = headerName; } public override Task ExecuteBindingAsync(ModelMetadataProvider MetadataProvider,HttpActionContext actionContext,CancellationToken cancellationToken) { IEnumerable<string> values; if (actionContext.Request.Headers.TryGetValues(this.name,out values)) { actionContext.ActionArguments[this.Descriptor.ParameterName] = values.FirstOrDefault(); } var taskSource = new TaskCompletionSource<object>(); taskSource.SetResult(null); return taskSource.Task; } } public abstract class FromHeaderAttribute : ParameterBindingAttribute { private string name; public FromHeaderAttribute(string headerName) { this.name = headerName; } public override HttpParameterBinding GetBinding(HttpParameterDescriptor parameter) { return new FromHeaderBinding(parameter,this.name); } } public class MyHeaderAttribute : FromHeaderAttribute { public MyHeaderAttribute() : base("MyHeaderName") { } }
然后你可以像这样使用它:
[HttpGet] public IHttpActionResult GetItem([MyHeader] string headerValue) { ... }
希望有所帮助.