2014-10-19 69 views
0

我已经将使用IIS运行的现有web api项目移植到OWIN(selfhosted)。我正在使用依赖注入(统一)并实现了一个服务,它需要来自当前请求头部的一些信息(即var x = HttpContext.Current.Request.Headers["xxx"])。如何使用Owin Self Host Web API获取请求标头

由于HttpContext不适用于OWIN(这是有道理的) - 我怎样才能得到当前的请求?请记住,我确实需要注入服务中的这些信息(不在控制器和OWIN中间件模块 - owincontext内)。

+1

你有没有找到解决方案?在控制器中获取标题的答案不能解决问题。 – 2015-03-06 21:03:16

回答

2

您的控制器应该继承ApiController,其中Request属性将为每个请求填充。所以从你的控制器动作中,只需使用Request.Headers[...]

0

创建一个示例类像下面

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; 

变种headerParser =新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; 
    } 
相关问题