Asp.Net Core 2.x HttpContext.Current实际不可用

时间:2018-08-07 00:10:55

标签: c# asp.net-core

在将asp.net mvc 4.6应用程序移植到1.0到2.0和2.0的asp.net核心2.1吨时,我没有看到太多信息。到2.1篇文章,但变化有些陡峭。

好吧,我遍历了google和stackoverflow,我正在尝试/想要做的就是将一个较旧的.net应用程序转换为.net核心。

我看到一些大罪魁祸首:

HttpContext.Current
HttpContext.Current.Request.Url.AbsolutePath
HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)
private static string CollectionToHtmlTable(HttpCookieCollection collection)

我看到这些文章很有帮助,但是有很多不足之处。

https://www.carlrippon.com/httpcontext-in-asp-net-core/ https://dotnetcoretutorials.com/2017/01/05/accessing-httpcontext-asp-net-core/

内部控制器似乎最简单,但是HttpContext.Current中的大多数内容都散布在域库等的各个地方。

因此,在以上两个网址中,似乎在startup.cs中使用以下行 但是,我没有在asp.net主核心之外的startup.cs

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

然后在启动时我也看到了这篇文章 https://www.strathweb.com/2016/12/accessing-httpcontext-outside-of-framework-components-in-asp-net-core/

//one of many things added to project
services.AddHttpContextAccessor();
  

我意识到在过去的几年中已经问了几个问题-希望一些勇敢的人已经探索了这些东西,并对如何迁移这些东西提出了一些建议/答案。

端口方法:#1

  public Service(string key, LogRecord.CallType callType, string operation, string opArg, string opResponse)
    {
        this.Key = string.IsNullOrEmpty(key)
                       ? HttpContext.Current != null ? "Inbound/WebHttp: " + HttpContext.Current.Request.Url.AbsolutePath : string.Empty
                       : key;
        this.CallType = Enum.GetName(typeof(LogRecord.CallType), callType);
        this.URL = HttpContext.Current != null && callType == LogRecord.CallType.WebHttp
                       ? HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)
                       : string.Empty;
        this.Operation = operation;
        this.OpArg = opArg;
        this.OpResponse = opResponse;
    }

另一个:#2

   private static string CollectionToHtmlTable(HttpCookieCollection collection)
    {
        // Converts HttpCookieCollection to NameValueCollection
        var nvc = new NameValueCollection();
        foreach (string item in collection)
        {
            var httpCookie = collection[item];
            if (httpCookie != null)
            {
                nvc.Add(item, httpCookie.Value);
            }
        }

        return CollectionToHtmlTable(nvc);
    }

2 个答案:

答案 0 :(得分:3)

问题是,您当前使用的是错误的。

  

内部控制器似乎最简单,但是其中大多数HttpContext。当前内容散布在域库等的各个位置。

域图书馆应独立于前端。不管是带有Session的网站还是有状态的WPF应用程序,都没有关系。或RestFull Api。

也就是说,相对快速修复方法是将HttpContext enter image description here插入您的域类。

public DomainService(IHttpContextAccessor httpContext)
{
    _httpContext = httpContext;
}

然后您可以通过依赖注入获得DomainService。如果创建过程很复杂,那么您正在寻找inject

或者您可以在ActionMethod中自己创建服务(当然,在这种情况下,您需要将服务的构造函数更改为HttpContext:

public IActionResult Foo()
{
    var service = new DomainService(HttpContext)
}

说:它被删除是有原因的。请不要依赖您域中的HttpContext!创建一个业务对象,并将其作为参数提供给域。


不确定这是否是最好的方法,但是我已经创建了BusinessContext类并将其注册为作用域。工厂负责用所需的数据创建它。


不要这样做:

如果您真的很疯狂,也许Factory可以帮助您进行迁移。

答案 1 :(得分:1)

应OP的要求将其发布,因此这不是一个完整的答案。您可以像这样从IHttpContextAccessor重构URI:

IHttpContextAccessor context; // injected
var request = context.HttpContext.Request;

var uriBuilder = new UriBuilder();
uriBuilder.Scheme = request.Scheme;
uriBuilder.Host = request.Host.Host;
if (request.Host.Port.HasValue)
{
    uriBuilder.Port = request.Host.Port.Value;
}
uriBuilder.Path = request.Path;
if (request.QueryString.HasValue)
{
    uriBuilder.Query = request.QueryString.Value.Substring(1);
}

var requestUri = uriBuilder.Uri;

同样,您可以通过以下方式访问IRequestCookieCollection

var collection = context.HttpContext.Request.Cookies
foreach (KeyValuePair<string, string> cookie in collection)