我做了一些搜索,但似乎没有找到任何东西……
使用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)
- {
- ...
- }
希望有所帮助.