【问题标题】:How to get request headers using Owin Self Host Web API如何使用 Owin Self Host Web API 获取请求标头
【发布时间】:2016-11-25 13:54:39
【问题描述】:

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

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

【问题讨论】:

  • 您找到解决方案了吗?在控制器中获取headers的答案并不能解决问题。

标签: c# asp.net-web-api owin self-hosting


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    创建如下示例类

    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,如下所示,所以它运行在所有的控制器类中,控制器是通过依赖注入windsor castle生成的

    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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      • 2016-03-12
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多