global.asaxからServer.MapPath()を使用するにはどうすればよいですか?


122

Server.MapPath()保存するいくつかのファイルパスを結合するために使用する必要がありますweb.config

ただし、Server.MapPath()現在のHttpContextに依存しているため(私はそう思います)、これを行うことはできません。メソッドを使用しようとすると、「使用可能」であるにもかかわらず、次の例外が発生します。

この操作ではサーバー操作は利用できません。

など~/App_Data/の完全な物理パスになど、Webルートの相対ディレクトリをマップできる別の方法はありC:\inetpub\wwwroot\project\App_data\ますか?

回答:


295

あなたはSystem.Web.Hosting.HostingEnvironment.MapPath()を試すことができます。

HttpContextは不要です。


このテクニックの注意点はありますか?
John Bubriski

10
いいえ。Reflectorを起動すると、Server.MapPathとRequest.MapPathが最終的にVirtualPath.MapPathを呼び出し、これが最終的にHostingEnvironment.MapPathを呼び出します。それらはすべて同じ場所に行き着きます。HostingEnvironment.MapPathは、中間者を排除します。
コービン3月

1
+1これは私のために働いていたオープンソースプロジェクトを修正し、何らかの理由でHttpContext.Current.Serverがコンテキストを持たないために爆発したために初期化を停止しました。これに切り替えると、スムーズな航行に戻ります。
Chris Marisic


1

Global.asaxで、コンテキストオブジェクトを使用します。

context.Server.mappath()

コンテキストを使用すると、セッションコレクション、リクエストオブジェクト、レスポンスオブジェクトにもアクセスできます。エラーをログに記録する場合などに非常に役立ちます。


ContextGlobal.asaxでの保証はありません。
アンダーストルンブラッド2017

-3

あなたはHttpContext.Current.Server.MapPath( "/")を試すことができます-それは私が以前にクラスでそれを参照した方法です。


2
実際にHttpContextを持っているクラスでそのように参照できますが、global.asaxにはないので、エラーメッセージが表示されます。
John Bubriski
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.