如何使用 Owin 自托管 Web API 获取请求标头

本文关键字:获取 API 请求 Web 何使用 Owin | 更新日期: 2023-09-27 18:26:59

我已经将一个现有的Web api项目(已使用IIS运行(移植到OWIN(自托管(。我正在使用依赖注入(unity(并实现了一项服务,该服务需要来自当前请求标头的一些信息(即 var x = HttpContext.Current.Request.Headers["xxx"] (。

由于 HttpContext 在 OWIN 中不可用(这是有道理的( - 我如何获取当前请求?请记住,我确实需要在注入的服务中(而不是在控制器和 OWIN 中间件模块 - owincontext 中(中需要此信息。

如何使用 Owin 自托管 Web API 获取请求标头

控制器应继承自 ApiController ,该 具有将为每个请求填充的 Request 属性。因此,从控制器操作中只需使用 Request.Headers[...] .

创建一个示例类,如下所示

public class HeaderParser
{
    IDictionary<string, object>  _requestContext;
    IDictionary<string, string[]> _headers;
    public HeaderParser(IDictionary<string, object> requestContext)
    {
        _requestContext = requestContext;
        _headers = requestContext["owin.RequestHeaders"] as IDictionary<string, string[]>;
    }
    public string GetEmployeeNoFromHeader()
    {
        if (_headers != null && _headers.ContainsKey("X-EmployeeNo") && _headers["X-EmployeeNo"] != null && _headers["X-EmployeeNo"].Length > 0)
        {
            return _headers["X-EmployeeNo"][0];
        }
        else
        {
            var response = new HttpResponseMessage(HttpStatusCode.BadRequest);
            response.Content = new StringContent("EMPLOYEE NO NOT AVAILABLE IN REQUEST");
            throw new HttpResponseException(response);
        }
    }
}

在控制器中,如下所示的内容应该可以工作

var owincontext = request.GetOwinContext().Environment;

var headerParser= new HeaderParser(owincontext(;headerParser.GetEmployeeNoFromHeader((

我们所做的是我们已经实现了接口IHttpControllerActivator.Create,如下所示,因此它适用于所有控制器类,控制器由依赖注入生成 温莎城堡

public IHttpController Create(
        HttpRequestMessage request,
        HttpControllerDescriptor controllerDescriptor,
        Type controllerType)
    {
       var owincontext = request.GetOwinContext().Environment;
       var headerParser= new HeaderParser(owincontext);
       var logger = _dpendencyManager.Resolve(typeof(IPOSLogger)) as IPOSLogger;
       var executionContext = new ExecutionContext(logger, owincontext,headerParser.GetEmployeeNoFromHeader());
       var controller =
           (IHttpController)_dpendencyManager.Resolve(controllerType, new { context = executionContext });
       //var controller =
       //  (IHttpController)_dpendencyManager.Resolve(controllerType);
       request.RegisterForDispose(
           new Release(
               () => _dpendencyManager.Release(controller)));
        return controller;
    }