Почему текущий корневой путь корневого приложения ASP.NET MVC недоступен в другом потоке / Задаче?
Один из моих недавних проектов связан с отправкой электронных писем с напоминаниями на основе некоторых настроек напоминаний. Отправка электронной почты осуществляется в асинхронном режиме с использованием Quartz.net. и это требует, чтобы включить постоянную ссылку на объект в приложении.
Однако, чтобы получить эту постоянную ссылку, я должен иметь возможность вычислить полный URL-адрес на основе идентификатора, хранящегося в очереди, используемой для работы. Ответ не прост, так как HttpContext
недоступен в контексте потока.
Одним из решений является сохранение корневого пути приложения в очереди и использование его оттуда. Другой способ - использовать функцию, подобную следующей:
public static String GetCurrentBasePath(String prefix = "http://")
{
return String.Format("{0}{1}{2}",
prefix, // protocol
System.Net.Dns.GetHostEntry("").HostName, // host
System.Web.HttpRuntime.AppDomainAppVirtualPath // virtual application path
);
}
Однако это имеет (серьезные) ограничения, так как протокол должен быть предоставлен и также возвращает hostname
, не domain name
что делает его бесполезным, когда несколько веб-приложений связаны с одним и тем же хостом.
Вопрос: доступен ли базовый путь веб-приложения в другом потоке / задаче?, Я думаю, что другой контекст потока / задачи как-то связан с ApplicationPool
, а не WebApp
и так как несколько WebApp
s может использовать то же самое ApplicationPool
нет прямой связи между контекстом потока и WebApp
,
1 ответ
Я не уверен, как вы вызываете это. Но из моего опыта параллелизм (как вы уже упоминали) теряет HttpContext. Тем не менее, ничто не мешает вам использовать переменную config со строковыми значениями, которые вам нужны. Конечно, в зависимости от того, насколько динамичным является это значение, это может быть не лучшим вариантом действий. Но помните, что вычисления, которые вы делаете выше, являются дорогостоящими, поэтому не забывайте хранить значение локально.
Я полагаю, что лучшим решением здесь (при условии, что вы знаете значения контекста, а я не понимаю, почему вы не можете / не хотите) было бы установить некоторые переменные и вообще избежать вычислений.
static readonly string hostName = "your-host";
static readonly string virtualPath = "your-virtual-path";
public static String GetCurrentBasePath(String prefix = "http://")
{
return String.Format("{0}{1}{2}",
prefix, // protocol
hostName, // host
virtualPath // virtual application path
);
}