私の最近のプロジェクトの 1 つに、何らかのリマインダー構成に基づいてリマインダー メールを送信することが含まれていました。電子メール送信は、Quartz.net を使用した非同期ジョブで実装されます。また、アプリケーション内のエンティティへのパーマリンクを含める必要があります。
ただし、このパーマリンクを取得するには、ジョブに使用されるキューに格納されている識別子に基づいて、完全な URL を計算できる必要があります。HttpContext
スレッドのコンテキストでは利用できないため、答えは簡単ではありません。
1 つの解決策は、アプリケーションのルート パスをキューに保存し、そこから使用することです。別の方法は、次のような関数を使用することです。
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
。