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

5

我发现有几个来源说在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);
  }
}

这个类由MediaTypeFormatter使用。

这个类的期望值是,利用原始请求中使用相同的主机,并且利用任何在原始请求上的路由值来构建链接。

但是...我怎样才能得到HttpRequestMessage?虽然它也被封装在MediaTypeFormatter中,但它本身也没有。

一定有一种简单的方法可以获取HttpRequestMessage - 我忽略了什么吗?

谢谢

Jon


我找到了这个链接,看起来很有帮助 http://forums.asp.net/t/1810996.aspx/1 - Jon Hoguet
1个回答

2

我最终创建了以下基础格式化程序(Formatter),它公开了请求(request)对象,现在我将能够将其传递给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”属性中? - Maxime Rossini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接