私の最近のプロジェクトの1つは、リマインダーの設定に基づいてリマインダーEメールを送信することでした。電子メールの送信は、Quartz.net.を使用して非同期ジョブで実装され、アプリケーション内のエンティティにパーマリンクを含める必要があります。なぜ現在のASP.NET MVCアプリケーションルートの仮想パスが別のスレッド/タスクで利用できないのですか?
ただし、このパーマリンクを取得するには、ジョブに使用されたキューに格納されている識別子に基づいて完全なURLを計算できる必要があります。スレッドのコンテキストではHttpContext
が利用できないため、答えは簡単ではありません。
解決策の1つは、アプリケーションのルートパスをキューに格納し、そこから使用することです。もう一つの方法は、次のような機能を使用することである:プロトコルは複数を有する場合、したがって無駄それをレンダリング、domain name
設けられてもhostname
を返し、ないしなければならないので、これは、(重度の)制限を有する
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
);
}
Webアプリケーションは同じホストにバインドされています。
質問:別のスレッド/タスクで使用できるWebアプリケーションのベースパスですか?。私は、他のスレッド/タスクのコンテキストは、WebApp
ではなく、ApplicationPool
に何らかの形で接続されていると思います。を複数使用することができるので、WebApp
と直接接続することはできません。
私はQuarz.netを使用していますが、それは新しいスレッドを使用して再現性のある、タスク(TPL)またはasync /待っています。基本的には、Windowsサービスなどを作成するのではなく、IISでジョブを実行しています。 – Alexei
右。私が言ったように、あなたが計算しようとしている値が何であるかを知っていれば、内部の読み取り専用値として設定する方が良いと思うと思います。スレッドの安全性を確保し、サイクルを節約します。 – pimbrouwers