web-dev-qa-db-ja.com

wcfアプリケーションの作業パスを取得する方法は?

WCFアプリケーションの作業フォルダーを取得したい。どうすれば入手できますか?

私が試してみると

HttpContext.Current.Request.MapPath(HttpContext.Current.Request.ApplicationPath)

Null参照例外が発生します(Http.Currentオブジェクトがnullです)。


作業フォルダーで私が意味したのは、WCFサービスが実行されているフォルダーです。 aspNetCompatibilityEnabled="true"を設定すると、次のエラーが表示されます。

サーバーは意味のある応答を提供しませんでした。これは、契約の不一致、セッションの早期シャットダウン、または内部サーバーエラーが原因である可能性があります。

68
Stefan Filip

IIS6でホストされているWCFアプリケーションにも同じ情報が必要でしたが、これでうまくいくことがわかりました。

string apPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

いつものように、YMMV。

170
Donald Byrd

以下のongleの回答をご覧ください。これよりずっといいです。

詳細情報の後に更新

次は私のために働いた。 IIS Service1.svcを介してホストした新しいWCFサービスでテストしました。

  1. _<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>_をWeb設定に追加します。 _<system.serviceModel>..</ ..>_はすでに存在しています。
  2. [許可モード]でサービスにAspNetCompatibilityRequirementsAttributeを追加します。
  3. 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>
_
31
Mikko Rantanen

あなたが望むものに応じて。私は通常「〜/ folder/file」のようなURLを解決したいです。これが機能しました。

System.Web.Hosting.HostingEnvironment.MapPath("~/folder/file");
20
Osa

より一般的には、私はこれを使用しています

AppDomain.CurrentDomain.BaseDirectory
18
Khoa Nguyen

AspNetCompatibilityEnabled = "true"で問題は解決したはずですが、次のエラーが表示されました。

サーバーは意味のある応答を提供しませんでした。これは、契約の不一致、セッションの早期シャットダウン、または内部サーバーエラーが原因である可能性があります。

現在のアプリドメインから取得することで、実行中のWCFサービスの物理パスを取得する問題を解決しました。

AppDomain.CurrentDomain.BaseDirectory
12
Stefan Filip

HttpContextオブジェクトなどのASP.NET機能を参照するには、WCFアプリをASP.NET互換モードで実行する必要があります。この 記事 では、これを行う方法について説明しています。

3
pmarflee

WCFでHostingEnvironment.ApplicationPhysicalPathを使用して、アプリケーションの物理パスを見つけます。 System.Web.Hostingを使用して名前空間を使用します。

2
Majid Khan