ASP.NETでは、HttpContext.CurrentがNULLの場合、物理ファイルのパスをどのように取得しますか?
-
01-07-2019 - |
質問
私は DotNetNuke のスケジューラを使用してタスクをスケジュールしており、作成した電子メール テンプレートの物理ファイル パスを取得しようとしています。問題は、スケジュールされたタスクが別のスレッド上にあり、http リクエストがないため、HttpContext が NULL であることです。ファイルの物理パスを取得するにはどうすればよいでしょうか?
解決
System.Web.Hosting.HostingEnvironment.MapPath あなたが探しているものです。Server オブジェクトまたは HttpContext.Current オブジェクトを使用するときは常に、最初に次のことを確認してください。 ホスティング環境 必要なものがあります。
他のヒント
これを行うには多くの方法があります。私は個人的に、モジュールの構成オプションとしてパス情報を保存することでこの問題を回避しています。これはエレガントではありませんが、毎回機能し、機能します。
Joe Brinkman のどこかに、スケジューラ内で使用する新しい HTTPContext を構築する方法に関するブログ投稿があると思います。
このプロセスは Web サイトに関しては実際には帯域外であるため、構成ファイルにパスを入力するだけでよいかもしれません。
最良のアイデアではないかもしれませんが、代替案です。
this.GetType().Assembly.Location とは何ですか?
次のようにアセンブリとコードベースのパスを確認できますか?
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 ...