在将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);
}
答案 0 :(得分:3)
问题是,您当前使用的是错误的。
内部控制器似乎最简单,但是其中大多数HttpContext。当前内容散布在域库等的各个位置。
域图书馆应独立于前端。不管是带有Session的网站还是有状态的WPF应用程序,都没有关系。或RestFull Api。
也就是说,相对快速修复方法是将HttpContext 插入您的域类。
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)