gpt4 book ai didi

c# - .Net 标准的自定义 System.Web.HttpContext

转载 作者:行者123 更新时间:2023-11-30 18:12:54 27 4
gpt4 key购买 nike

我们有几个网站是用 .Net Framework 编写的。现在我们要转向.Net Core。我们想一个一个地做,这样旧网站和新网站应该并存。所有网站都共享通用的 dll,例如 LoggerDll。

为了两个网站(旧的和新的)只使用一个 dll,我们将 LoggerDll 更改为 .Net Standard 并从两个网站添加对它的引用。

问题是 LoggerDll 引用了 System.Web dll 以获取请求的 IP(和其他请求信息)以写入日志,而它在 .Net Core 中不存在。

例如:

public void WriteToLog(string message)
{
//This line doesn't compile in .Net Core
string userIp = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
WriteToDB(message, userIp);
}

我不想将 IP 作为参数传递给 WriteToLog,因为这样我就需要将它作为参数添加到调用它的所有方法中,几乎每个方法都会在异常发生时调用 WriteToLog。

所以我更喜欢继续从一些“全局”对象获取请求信息,但它应该在 .Net Core 和 .Net Framework 中编译。

我想创建新类“MyRequestInfo”,为它创建一个静态属性,并在“BeginRequest”事件中用数据填充它。

例如:

public class MyRequestInfo
{
public string UserIp { get; set; }
}

public class MyRequest
{
[ThreadStatic] \\ Is ThreadStatic is ok?
public static MyRequestInfo ReqInfo { get; set; }
}

//Global.asax
protected void Application_BeginRequest(object sender, EventArgs e)
{
MyRequest.ReqInfo.UserIp = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}

//LoggerDll
public void WriteToLog(string message)
{
string userIp = MyRequest.ReqInfo.UserIp;
WriteToDB(message, userIp);
}
  1. 这个灵魂还好吗?
  2. [ThreadStatic] 是正确的还是我应该使用 AsynLocal 或其他东西?

谢谢

最佳答案

Is this soultion is OK?

您的解决方案不适用于 async/await,因为两个不同的线程可以参与其中,并且 [ThreadStatic] 属性不会在异步流中保留值。

I should use AsynLocal or something else?

我不知道如何使用 AsynLocal 来实现它。

这里是一个基本的思路:

LoggerDll

public static Func<string> UserIpGetter;
public void WriteToLog(string message)
{
string userIp = UserIpGetter();
WriteToDB(message, userIp);
}

Asp.Net

//Global.asax
static string GetUserIp()
{
return System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
protected void Application_Start(object sender, EventArgs e)
{
LoggerDll.UserIpGetter = GetUserIp;
}

Asp.Net 核心

启动.cs

public class Startup
{
static IServiceProvider _serviceProvider;
static string GetUserIp()
{
return _serviceProvider.GetService<IHttpContextAccessor>()
.HttpContext.Connection.RemoteIpAddress.ToString();
}
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpContextAccessor();
...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
_serviceProvider = app.ApplicationServices;
LoggerDll.UserIpGetter = GetUserIp;
...
}
}

要改进此代码,您可以声明:interface IUserIpGetter {string GetUserIp();},在 Asp.Net 中编写一个实现,在 Asp 中编写另一个实现。 Net Core,在DI中注册,注入(inject)LoggerDll.ctor

关于c# - .Net 标准的自定义 System.Web.HttpContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54620265/

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