加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 00:20:17 所属栏目:asp.Net 来源:网络整理
导读:我做了一些搜索,但似乎没有找到任何东西…… 使用WebApi,我想将输入参数映射到标题值:例如 例如.在控制器中: public User GetUser(int id){ ... return user;} 我希望WebApi将id参数映射到标头值(例如X-Auth:1234)…而不是URL参数. 这支持吗? 解决方法
我做了一些搜索,但似乎没有找到任何东西……

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

例如.在控制器中:

public User GetUser(int id){
   ...
   return user;
}

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

这支持吗?

解决方法

我不认为这是开箱即用的,例如[FromBody]属性.
您似乎应该能够使用模型绑定器来实现此功能,如 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)
{
    ...
}

希望有所帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读