- PR -

HttpContext.Currentがないの場合の仮想パス→物理パスの変換方法

1
投稿者投稿内容
BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2008-11-03 22:52
ASP.NETで仮想パスを物理パスに変換する方法は、通常、

HttpContext.Current.Server.MapPath

を使用すると思いますが、HttpContext.Currentがない場合には何かよい方法はありませんでしょうか?

というのも、ウェブアプリ内部でタスクスケジューラのようなことをやっており、
そのタスク実行用のクラスの中で仮想パスを物理パスに変更したいのです。

具体的には、IISのアクセスログを定時に一次処理するのですが、そのログの置き場を
~/App_Data/の下にしています。
タスク実行用クラスは定期的に作成するスレッド中でインスタンス化され、そこでログを読み込もうとします。
しかし、スレッド内部ではHttpContext.Currentがないようで、パスの変換ができません。

パスを固定に書いてもよいのですが、できれば汎用性を確保したいので何かよい方法がありましたらアドバイスいただけますでしょうか。

よろしくお願いします。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2008-11-04 00:04
Windows アプリケーションから、IIS の仮想ディレクトリ情報を取得したいということですよね。だとしたら、このあたりを調べたらどうだろう。

http://blogs.wankuma.com/naoko/archive/2007/01/11/55632.aspx
http://msdn.microsoft.com/ja-jp/library/cc338291.aspx

※ 権限に注意
_________________
かるあ のメモスニペット
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2008-11-04 00:09
あっ、質問読んでなかった(汗
ASP.NETから起動されるThreadの方で読みたいんですよね。
だとしたら、パラメータで起動するときに渡してあげないとダメな気がする。
_________________
かるあ のメモスニペット
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2008-11-04 10:54
(string)AppDomain.CurrentDomain.GetData("DataDirectory")
保証はない。

--追記
もうちょっとまじめにやるなら
HostingEnvironment.MapPath
とか


[ メッセージ編集済み 編集者: なちゃ 編集日時 2008-11-04 10:58 ]
BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2008-11-04 21:41
かるあさん、なちゃさん、アドバイスどうもありがとうございます。

試してみたところ、お二人のいずれの方法でも変換ができました。

かるあさんの方法では、スレッドの管理をするスケジューラ用クラスを
ウェブアプリケーションの起動時に呼び出すため、
Global.asaxのApplication_Startメソッド内で、
仮想パスを物理パスに変換してからパラメータとして渡しました。

なちゃさんの方法は、HttpContext.Current.Server.MapPathの置き換えだけで
できるので変更部分が少なくてよいですね。
最初はWeb.configとかに書いておくしかないのかな?とも考えていたのですが、
仮想パスってHttpContextとあんまり関係なさそうなので、別の手法もあるのでは?
と思って質問してみたのですが、聞いてみてよかったです。

他にも使えそうなクラスやメソッドも知ることができましたし、
保守性も高まって大変助かりました。
どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)