Asp.net web api 如何在控制器构造函数中读取头

Asp.net web api 如何在控制器构造函数中读取头,asp.net-web-api,Asp.net Web Api,可以在我的控制器构造函数中读取头授权吗?怎么做?这是在控制器构造函数中读取标题值以实现我的目标的最佳解决方案吗 以下是继承接口的类的代码: public interface IProvider { string SendData(string data); //other methods } public class FirstProvider : IProvider { private string _url; public FirstProvider(str

可以在我的控制器构造函数中读取头授权吗?怎么做?这是在控制器构造函数中读取标题值以实现我的目标的最佳解决方案吗

以下是继承接口的类的代码:

public interface IProvider
{
    string SendData(string data);
    //other methods
}

public class FirstProvider : IProvider
{
    private string _url;
    public FirstProvider(string url)
    {
        _url = url;
    }

    public string SendData(string data)
    {
        //send data to First provider website (_url)
        //return result
    }
}

public class SecondProvider : IProvider
{
    //some code
}
以及以下API控制器:

public class ProviderController : ApiController
{
    private IProvider _provider;

    public ProviderController()
    {
        //read authorization key from headers (How??)
        string authToken;

        //fetch from database/cache what provider to use based on the authorization key
        var provider = Providers.GetProvider(authToken);
        //Initialize _provider based on the database query result
        if (provider.Name == "a")
        {
            _provider = new FirstProvider(provider.Data);
        }
        else if (provider.Name == "b")
        {
            _provider = new SecondProvider(provider.Data);
        }
        //Other providers will be added in future
    }

    public ProviderController(IProvider provider)
    {
        _provider = provider;
    }

    public IHttpActionResult SendData(string data)
    {
        _provider.SendData(data);
        return Ok();
    }
}
您可以使用System.Web.HttpContext.Current.Request.Headers

但是,您应该使用构造函数注入,您似乎已经在使用其他构造函数公共提供程序ControllerIprovider

可以使用IOC容器根据请求进行条件绑定。看见

您在这里想要实现什么?您是否正在尝试查看呼叫者是否被授权?如果是这样,那么看看基于声明的身份验证。WebAPI中有很多选项可用于处理此问题。授权是我将继续执行的另一个步骤,但是,我的问题不是授权,而是在控制器构造函数或其他任何地方读取授权密钥,如果这不是从数据库获取数据的最佳选项,请选择提供程序。名称从[ComplexQuery]……其中authKey=[authKey from header]这告诉我要使用哪个提供程序来初始化_provider并在其他方法中使用它,但在IsRouteValueDefined中调用数据库/缓存提供程序是否是最佳做法明智的?我必须在数据库中检查要为该授权令牌的用户所有者使用哪个提供程序可能使用工厂模式并具有一个类,例如ProviderFactory具有名为IProvider CreateProviderobject someObject的方法来决定要创建哪个IProvider。@Padraic我曾经使用System.Web.HttpContext.Current.Request.headers来获取标题。但是,它给出了编译时错误,因为无法解析符号“Current”@Balagurunhanmarimuthu您在应用程序中引用过System.Web程序集吗?