如何使用 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 中(中需要此信息。
控制器应继承自 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;
}