WCFアプリケーションの作業フォルダーを取得したい。どうすれば入手できますか?
私が試してみると
HttpContext.Current.Request.MapPath(HttpContext.Current.Request.ApplicationPath)
Null参照例外が発生します(Http.Currentオブジェクトがnullです)。
作業フォルダーで私が意味したのは、WCFサービスが実行されているフォルダーです。 aspNetCompatibilityEnabled="true"
を設定すると、次のエラーが表示されます。
サーバーは意味のある応答を提供しませんでした。これは、契約の不一致、セッションの早期シャットダウン、または内部サーバーエラーが原因である可能性があります。
IIS6でホストされているWCFアプリケーションにも同じ情報が必要でしたが、これでうまくいくことがわかりました。
string apPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
いつものように、YMMV。
以下のongleの回答をご覧ください。これよりずっといいです。
詳細情報の後に更新
次は私のために働いた。 IIS Service1.svcを介してホストした新しいWCFサービスでテストしました。
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
_をWeb設定に追加します。 _<system.serviceModel>..</ ..>
_はすでに存在しています。AspNetCompatibilityRequirementsAttribute
を追加します。HttpContext.Current.Server.MapPath(".");
を使用して、ルートディレクトリを取得します。以下は、サービスクラスの完全なコードです。 IService1インターフェイスに変更を加えませんでした。
_[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1 : IService1
{
public void DoWork()
{
HttpContext.Current.Server.MapPath(".");
}
}
_
そして、以下はweb.configからの抜粋です。
_<system.serviceModel>
<!-- Added only the one line below -->
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<!-- Everything else was left intact -->
<behaviors>
<!-- ... -->
</behaviors>
<services>
<!-- ... -->
</services>
</system.serviceModel>
_
古い回答
Working Folderとはどういう意味ですか? WCFサービスはいくつかの異なる方法で、異なるエンドポイントでホストできるため、作業フォルダーは少しあいまいです。
Directory.GetCurrentDirectory() を呼び出して、通常の「作業フォルダー」を取得できます。
HttpContextはASP.Netオブジェクトです。 IISでWCFをホストできる場合でも、ASP.Netではないため、ASP.Net技術のほとんどはデフォルトでは機能しません。 OperationContextは、WCFのHttpContextに相当します。 OperationContextには、特に着信要求、発信応答に関する情報が含まれています。
最も簡単な方法は、web.configで切り替えることで ASP.Net互換モード でサービスを実行することです。これにより、ASP.Net HttpContextにアクセスできるようになります。 * HttpBindingsとIISホスティングに制限されます。互換モードを切り替えるには、web.configに以下を追加します。
_<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>
_
あなたが望むものに応じて。私は通常「〜/ folder/file」のようなURLを解決したいです。これが機能しました。
System.Web.Hosting.HostingEnvironment.MapPath("~/folder/file");
より一般的には、私はこれを使用しています
AppDomain.CurrentDomain.BaseDirectory
AspNetCompatibilityEnabled = "true"で問題は解決したはずですが、次のエラーが表示されました。
サーバーは意味のある応答を提供しませんでした。これは、契約の不一致、セッションの早期シャットダウン、または内部サーバーエラーが原因である可能性があります。
現在のアプリドメインから取得することで、実行中のWCFサービスの物理パスを取得する問題を解決しました。
AppDomain.CurrentDomain.BaseDirectory
HttpContextオブジェクトなどのASP.NET機能を参照するには、WCFアプリをASP.NET互換モードで実行する必要があります。この 記事 では、これを行う方法について説明しています。
WCFでHostingEnvironment.ApplicationPhysicalPathを使用して、アプリケーションの物理パスを見つけます。 System.Web.Hostingを使用して名前空間を使用します。