gpt4 book ai didi

c# - Asp.Net Core 2.x HttpContext.Current 不可用

转载 作者:行者123 更新时间:2023-11-30 14:22:07 25 4
gpt4 key购买 nike

我没有看到太多关于将 asp.net mvc 4.6 应用程序移植到 asp.net core 2.1 Tons of 1.0 to 2.0 and 2.0 的信息。到 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/

在 Controller 内部它似乎是最简单的,但是大部分 HttpContext.Current 东西散布在域库等各个地方。

所以在上面的两个 url 中,似乎在 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();

I realize that several questions have been asked in the last couple of years - here is to hoping that some brave soul has explored this stuff and has some advise/answers to how to migrate this stuff over.

端口方法:#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);
}

最佳答案

问题是,您目前使用错误。

Inside Controller it seems the easiest, but most of this HttpContext.Current stuff is sprinkled around various places domain libraries etc..

域库应该独立于前端。它是具有 session 的网站还是有状态的 WPF 应用程序并不重要。或者 RestFull API。

也就是说,相对 快速修复将是 inject将 HttpContext 放入您的域类中。

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

然后您可以通过依赖注入(inject)获取您的 DomainService。如果创建复杂,您正在寻找 Factory .

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

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

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


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


不要这样做:

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

关于c# - Asp.Net Core 2.x HttpContext.Current 不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51717147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com