2016-03-19 6 views
0

私の最近のプロジェクトの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と直接接続することはできません。

答えて

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 
    ); 
} 
+0

私はQuarz.netを使用していますが、それは新しいスレッドを使用して再現性のある、タスク(TPL)またはasync /待っています。基本的には、Windowsサービスなどを作成するのではなく、IISでジョブを実行しています。 – Alexei

+0

右。私が言ったように、あなたが計算しようとしている値が何であるかを知っていれば、内部の読み取り専用値として設定する方が良いと思うと思います。スレッドの安全性を確保し、サイクルを節約します。 – pimbrouwers

関連する問題