Asp.net web api 如何在WebApi中获取HttpRequestMessage而不是HttpContext.Current

Asp.net web api 如何在WebApi中获取HttpRequestMessage而不是HttpContext.Current,asp.net-web-api,Asp.net Web Api,我已经找到了一些源代码,它们说您不应该在WebApi中使用HttpContext.Current,但没有一个说您应该如何处理那些我们曾经使用HttpContext.Current的情况 例如,我有一个LinkProvider类,它为一个对象创建链接。(简化以保持主题) 公共抽象类链接提供程序:ILinkProvider { 受保护的ILink CreateLink(字符串链接关系、字符串routeName、RouteValueDictionary routeValues) { var conte

我已经找到了一些源代码,它们说您不应该在WebApi中使用HttpContext.Current,但没有一个说您应该如何处理那些我们曾经使用HttpContext.Current的情况

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

公共抽象类链接提供程序:ILinkProvider
{
受保护的ILink CreateLink(字符串链接关系、字符串routeName、RouteValueDictionary routeValues)
{
var context=System.Web.HttpContext.Current.Request.RequestContext;
var urlHelper=newsystem.Web.Mvc.urlHelper(上下文);
var url=string.Format(“{0}{1}”,context.HttpContext.Request.url.GetLeftPart(UriPartial.Authority),urlHelper.RouteUrl(routeName,routeValue));
///...
返回新链接(链接关系、url);
}
}
该类由MediaTypeFormatter使用

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

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

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

谢谢


Jon

我最终创建了以下基本格式化程序,它公开了请求,现在我将能够将其传递给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;
  }
}

我发现这个链接似乎很有帮助,我认为格式化程序实例对于所有请求都是通用的,所以它不会遇到巨大的并发问题吗?假设您几乎同时有两个传入请求(都是在任何响应序列化之前收到的),将在
request
属性中设置哪个请求?
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;
  }
}