0

我最近的一个项目涉及基于一些提醒配置发送提醒电子邮件。电子邮件发送是使用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,而不是WebAppand 因为多个WebApps 可以使用相同的ApplicationPool,所以线程上下文和WebApp.

4

1 回答 1

0

我不确定你是如何调用它的。但是根据我的经验,并行性(正如您所提到的)失去了 HttpContext。也就是说,没有什么可以阻止您将配置变量与您需要的字符串值一起使用。当然,根据这个值的动态程度,这可能不是最好的做法。但请记住,您在上面进行的计算很昂贵,因此请记住将值存储在本地。

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

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
   );
}
于 2016-03-19T14:18:52.820 回答