如何在 WebApi 中获取 HttpRequestMessage 而不是 HttpContext.Current

Jon*_*uet 5 asp.net-web-api

我发现有几个消息来源说您不应该在 WebApi 中使用 HttpContext.Current,但没有一个消息来源说您应该如何处理我们过去使用 HttpContext.Current 的情况。

例如,我有一个 LinkProvider 类,它为对象创建链接。(简化以保持主题)。

public abstract class LinkProvider<T> : ILinkProvider<T>
{
  protected ILink CreateLink(string linkRelation, string routeName, RouteValueDictionary routeValues)
  {
    var context = System.Web.HttpContext.Current.Request.RequestContext;

    var urlHelper = new System.Web.Mvc.UrlHelper(context);
    var url = string.Format("{0}{1}", context.HttpContext.Request.Url.GetLeftPart(UriPartial.Authority), urlHelper.RouteUrl(routeName, routeValues));

    ///...

    return new Link(linkRelation, url);
  }
}
Run Code Online (Sandbox Code Playgroud)

此类由 MediaTypeFormatter 使用。

此类预计将使用来自原始请求的同一主机并利用原始请求上的任何路由值来构建链接。

但是...我如何获取 HttpRequestMessage?这将由 MediaTypeFormatter 封装 - 但它也没有。

必须有一种简单的方法来获取 HttpRequestMessage - 我忽略了什么?

谢谢

乔恩

Jon*_*uet 2

我最终创建了以下公开请求的基本格式化程序,现在我将能够将其传递给 LinkProvider。

public class JsonMediaTypeFormatterBase : JsonMediaTypeFormatter
{

  public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, System.Net.Http.HttpRequestMessage request, MediaTypeHeaderValue mediaType)
  {
    Request = request;
    return base.GetPerRequestFormatterInstance(type, request, mediaType);
  }

  protected HttpRequestMessage Request
  {
    get;
    set;
  }
}
Run Code Online (Sandbox Code Playgroud)