DotNetNukeのスケジューラーを使用してタスクをスケジュールしており、作成した電子メールテンプレートの物理ファイルパスを取得しようとしています。問題は、スケジュールされたタスクが別のスレッドにあり、httpリクエストがないため、HttpContextがNULLになることです。ファイルの物理パスをどのように取得しますか?
5 に答える
System.Web.Hosting.HostingEnvironment.MapPathはあなたが探しているものです。Server または HttpContext.Current オブジェクトを使用している場合は常に、まずHostingEnvironmentに必要なものがあるかどうかを確認してください。
これには多くの方法があります。個人的には、パス情報をモジュールの構成オプションとして保存することで回避しています。エレガントではありませんが、毎回機能し、機能します。
Joe Brinkman のどこかで、スケジューラ内で使用する新しい HTTPContext を構築する方法についてのブログ投稿があると思います。
このプロセスは実際にはWebサイトとの関係で帯域外であるため、パスを構成ファイルに入れるだけでよい場合があります。
最善のアイデアではないかもしれませんが、それは代替案です。
this.GetType()。Assembly.Locationとは何ですか?
次のようなアセンブリとCodeBaseパスを確認できますか?
Imports System.Reflection
Imports System.IO
...
Path.GetDirectoryName( Assembly.GetExecutingAssembly().CodeBase )
この種のものは常に機能するとは限らないため、この場所で何が機能するかを確認するために、アセンブリに関する一連のデータを含むログを作成することをお勧めします。これは、AppCenterでホストされるCOMコンポーネントを作成するときに似たようなものを取得するために私がしなければならなかったことです。これを使用して「APP_BASE」を「取得」し、それを設定して、app.configファイルが正しく読み込まれるようにしました。
Log.Write ( Assembly.GetExecutingAssembly().CodeBase )
Log.Write ( Assembly.GetExecutingAssembly().Location )
Log.Write ( Path.GetFullPath(".") )
Log.Write ( Application.StartupPath )
... and so on, whatever you can think of ...