asp.net – WebApi:将参数映射到标头值

前端之家收集整理的这篇文章主要介绍了asp.net – WebApi:将参数映射到标头值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我做了一些搜索,但似乎没有找到任何东西……

使用WebApi,我想将输入参数映射到标题值:例如

例如.在控制器中:

  1. public User GetUser(int id){
  2. ...
  3. return user;
  4. }

我希望WebApi将id参数映射到标头值(例如X-Auth:1234)…而不是URL参数.

支持吗?

解决方法

我不认为这是开箱即用的,例如[FromBody]属性.
您似乎应该能够使用模型绑定器来实现此功能,如 here所述.在模型绑定器中,您可以访问请求及其标头,因此您应该能够读取标头并将其值设置为bindingContext.型号属性.

编辑:进一步阅读文章,似乎自定义HttpParameterBinding和ParameterBindingAttribute是一个更合适的解决方案,或者至少我会这样做.您可以实现一个通用的[FromHeader]属性来完成这项工作.我也在解决同样的问题,所以一旦我有了解决方案,我就会发布我的解决方案.

编辑2:这是我的实现:

  1. public class FromHeaderBinding : HttpParameterBinding
  2. {
  3. private string name;
  4.  
  5. public FromHeaderBinding(HttpParameterDescriptor parameter,string headerName)
  6. : base(parameter)
  7. {
  8. if (string.IsNullOrEmpty(headerName))
  9. {
  10. throw new ArgumentNullException("headerName");
  11. }
  12.  
  13. this.name = headerName;
  14. }
  15.  
  16. public override Task ExecuteBindingAsync(ModelMetadataProvider MetadataProvider,HttpActionContext actionContext,CancellationToken cancellationToken)
  17. {
  18. IEnumerable<string> values;
  19. if (actionContext.Request.Headers.TryGetValues(this.name,out values))
  20. {
  21. actionContext.ActionArguments[this.Descriptor.ParameterName] = values.FirstOrDefault();
  22. }
  23.  
  24. var taskSource = new TaskCompletionSource<object>();
  25. taskSource.SetResult(null);
  26. return taskSource.Task;
  27. }
  28. }
  29.  
  30. public abstract class FromHeaderAttribute : ParameterBindingAttribute
  31. {
  32. private string name;
  33.  
  34. public FromHeaderAttribute(string headerName)
  35. {
  36. this.name = headerName;
  37. }
  38.  
  39. public override HttpParameterBinding GetBinding(HttpParameterDescriptor parameter)
  40. {
  41. return new FromHeaderBinding(parameter,this.name);
  42. }
  43. }
  44.  
  45. public class MyHeaderAttribute : FromHeaderAttribute
  46. {
  47. public MyHeaderAttribute()
  48. : base("MyHeaderName")
  49. {
  50. }
  51. }

然后你可以像这样使用它:

  1. [HttpGet]
  2. public IHttpActionResult GetItem([MyHeader] string headerValue)
  3. {
  4. ...
  5. }

希望有所帮助.

猜你在找的asp.Net相关文章