簡體   English   中英

為什么當前的ASP.NET MVC應用程序根虛擬路徑在另一個線程/任務中不可用?

[英]Why current ASP.NET MVC application root virtual path is not available in a another thread/Task?

我最近的項目之一涉及根據一些提醒配置發送提醒電子郵件。 電子郵件發送是使用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並且由於多個WebApp可以使用同一ApplicationPool ,因此線程上下文和WebApp之間沒有直接連接。

我不確定您如何調用此功能。 但是根據我的經驗,並行性(如您所提到的)失去了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
   );
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM