Asp.net mvc 为什么当前ASP.NET MVC应用程序根虚拟路径在另一个线程/任务中不可用?

Asp.net mvc 为什么当前ASP.NET MVC应用程序根虚拟路径在另一个线程/任务中不可用?,asp.net-mvc,asynchronous,task,virtual-path,Asp.net Mvc,Asynchronous,Task,Virtual Path,我最近的一个项目涉及根据一些提醒配置发送提醒电子邮件。电子邮件发送是在异步作业中使用实现的,它需要在应用程序中包含指向实体的永久链接 然而,为了获得这个永久链接,我必须能够根据存储在用于作业的队列中的标识符计算完整的URL。答案并不简单,因为HttpContext在线程的上下文中不可用 一种解决方案是将应用程序根路径存储在队列中并从那里使用它。另一种方法是使用如下函数: public static String GetCurrentBasePath(String prefix = "http:/

我最近的一个项目涉及根据一些提醒配置发送提醒电子邮件。电子邮件发送是在异步作业中使用实现的,它需要在应用程序中包含指向实体的永久链接

然而,为了获得这个永久链接,我必须能够根据存储在用于作业的队列中的标识符计算完整的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
   );
}
但是,这有(严重的)限制,因为必须提供协议,并且还返回
主机名
,而不是
域名
,因此当多个Web应用程序绑定到同一主机时,该协议将变得无用


问题:Web应用程序基本路径在另一个线程/任务中可用吗?。我认为另一个线程/任务上下文以某种方式连接到
ApplicationPool
,而不是
WebApp
,并且由于多个
WebApp
s可以使用相同的
ApplicationPool
,因此线程上下文和
WebApp

之间没有直接的连接,我不确定您是如何调用它的。但根据我的经验,并行性(正如您所提到的)失去了HttpContext。也就是说,没有什么可以阻止您使用具有所需字符串值的配置变量。当然,根据该值的动态程度,这可能不是最佳的行动方案。但是请记住,上面的计算是昂贵的,所以请记住将值存储在本地

我相信这里最好的解决方案(假设你知道上下文值,我不明白你为什么不能/不会)是设置一些变量并完全避免计算


我使用的是Quarz.net,但是可以使用新线程、任务(TPL)或异步/等待进行复制。基本上,它是让作业在IIS中运行,而不是创建Windows服务或类似的东西。对。正如我所说,我认为如果你知道你试图计算的值是什么,我认为你最好将它们设置为内部只读值。为您提供线程安全性并节省周期。
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
   );
}