我最近的一个项目涉及基于一些提醒配置发送提醒电子邮件。电子邮件发送是使用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
,因此当多个 Web 应用程序绑定到同一主机时,它会变得无用。
问题:Web 应用程序基本路径在另一个线程/任务中是否可用?. 我认为另一个线程/任务上下文以某种方式连接到ApplicationPool
,而不是WebApp
and 因为多个WebApp
s 可以使用相同的ApplicationPool
,所以线程上下文和WebApp
.