У нас есть несколько сайтов, написанных на .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);
}
- Isс этим мнением все в порядке?
- Правильно ли [ThreadStatic] или я должен использовать AsynLocal или что-то еще?
Спасибо