0

私の最近のプロジェクトの 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

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 に答える