Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 控制器构造函数中的Web API读取头值_C#_Asp.net Web Api - Fatal编程技术网

C# 控制器构造函数中的Web API读取头值

C# 控制器构造函数中的Web API读取头值,c#,asp.net-web-api,C#,Asp.net Web Api,可以在web API控制器的构造函数中获取头信息吗?我想根据标题值设置变量,但我不想对每个方法都这样做。我对自定义头值特别感兴趣,但此时我会接受授权值。我可以让它在AuthorizationFilterAttribute中工作,但我也需要在控制器级别使用它 [PolicyAuthorize] public class PoliciesController : ApiController { public PoliciesController() { var x =

可以在web API控制器的构造函数中获取头信息吗?我想根据标题值设置变量,但我不想对每个方法都这样做。我对自定义头值特别感兴趣,但此时我会接受授权值。我可以让它在
AuthorizationFilterAttribute
中工作,但我也需要在控制器级别使用它

[PolicyAuthorize]
public class PoliciesController : ApiController
{
    public PoliciesController()
    {
        var x = HttpContext.Current;  //will be null in constructor
    }

    public HttpResponseMessage Get()
    {
        var x = HttpContext.Current;  //will be available but too late
    }
}

public class PolicyAuthorizeAttribute : AuthorizationFilterAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        var authHeader = actionContext.Request.Headers.Authorization;  //can get at Authorization header here but no HTTPActionContext in controller
    }
}

下面是一些你可以考虑的选项…更喜欢<代码> 1。< /代码>过<代码> 2。< /代码>

  • 在当前请求消息的属性包
    HttpRequestMessage.properties
    中存储其他数据,并在控制器中具有方便的属性,控制器中的所有操作都可以访问该属性

    [CustomAuthFilter]
    public class ValuesController : ApiController
    {
        public string Name
        {
            get
            {
                return Request.Properties["Name"].ToString();
            }
        }
    
        public string GetAll()
        {
            return this.Name;
        }
    }
    
    public class CustomAuthFilter : AuthorizationFilterAttribute
    {
        public override void OnAuthorization(HttpActionContext actionContext)
        {
            actionContext.Request.Properties["Name"] = "<your value from header>";
        }
    }
    
    [CustomAuthFilter]
    公共类值控制器:ApiController
    {
    公共字符串名
    {
    得到
    {
    return Request.Properties[“Name”].ToString();
    }
    }
    公共字符串GetAll()
    {
    返回此.Name;
    }
    }
    公共类CustomAuthFilter:AuthorizationFilterAttribute
    {
    授权时的公共覆盖无效(HttpActionContext actionContext)
    {
    actionContext.Request.Properties[“Name”]=“”;
    }
    }
    
  • 您可以获取当前控制器的实例并设置属性值。例如:

    [CustomAuthFilter]
    public class ValuesController : ApiController
    {
        public string Name { get; set; }
    
        public string GetAll()
        {
            return this.Name;
        }
    }
    
    public class CustomAuthFilter : AuthorizationFilterAttribute
    {
        public override void OnAuthorization(HttpActionContext actionContext)
        {
            ValuesController valuesCntlr = actionContext.ControllerContext.Controller as ValuesController;
    
            if (valuesCntlr != null)
            {
                valuesCntlr.Name = "<your value from header>";
            }
        }
    }
    
    [CustomAuthFilter]
    公共类值控制器:ApiController
    {
    公共字符串名称{get;set;}
    公共字符串GetAll()
    {
    返回此.Name;
    }
    }
    公共类CustomAuthFilter:AuthorizationFilterAttribute
    {
    授权时的公共覆盖无效(HttpActionContext actionContext)
    {
    ValuesController valuesCntlr=actionContext.ControllerContext.Controller作为ValuesController;
    如果(值cntlr!=null)
    {
    valuesCntlr.Name=“”;
    }
    }
    }
    

  • 我使用System.Web.HttpContext.Current.Request.Headers作为这个porpose