2009-04-26 35 views
66

WCFアプリケーションの作業フォルダを取得します。どうすれば入手できますか?wcfアプリケーションの作業パスを取得する方法は?

私は

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

をしようとした場合、私は(Http.Currentオブジェクトがnullである)null参照の例外を取得します。


作業フォルダの意味は、WCFサービスが動作しているフォルダです。私はaspNetCompatibilityEnabled="true"を設定した場合、私はこのエラーを取得:ASP.NETを参照するために

The server did not provide a meaningful reply; this might be caused by a contract mismatch, a premature session shutdown or an internal server error.

答えて

164

私はIIS6のために同じ情報を必要とは、WCFアプリケーションをホストされていると私はこれが私のために働いていたことがわかった:

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

いつものように、YMMV。

+2

このソリューションは私のためにはうまくいっていました。他の設定変更のすべての種類を行う必要はなく、むしろ使用することをお勧めします... –

+0

私はSystem.Web.Hostingを持っていません。 。 。 – nXqd

+1

@nXqd System.Web.dllに2.0のフレームワークに戻る – ongle

3

は、HttpContextオブジェクトのような特徴は、ASP.NET互換モードであなたのWCFアプリケーションを実行する必要があります。このarticleは、これを行う方法を説明しています。

31

下記のongleの回答をご覧ください。これはこれよりずっと優れています。以下は私のために働いた

詳細は後に更新し

。私はService1.svcを通してIIS上でホストされた新しいWCFサービスでそれをテストしました。

  1. ウェブ設定に<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>を追加します。既に<system.serviceModel>..</ ..>が存在しました。
  2. Mode Allowedを使用して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> 

旧答え

あなたが作業フォルダとはどういう意味ですか? WCFサービスは、いくつかの異なる方法で、異なるエンドポイントでホストできるため、作業フォルダはわずかにあいまいです。

Directory.GetCurrentDirectory()を呼び出すと、通常の「作業フォルダ」を取得できます。

HttpContextはASP.Netオブジェクトです。 WCFがIIS上でホストされていても、それはまだASP.Netではないので、ほとんどのASP.Netテクニックはデフォルトでは動作しません。 OperationContextは、WCFのHttpContextに相当するものです。 OperationContextには、着信要求、発信応答などの情報が含まれています。

ASP.Net compatibility modeでサービスを実行するのが最も簡単な方法は、web.configで切り替えることです。これにより、ASP.Net HttpContextにアクセスできるようになります。それは* HttpBindingsとIISのホスティングに制限されます。互換モードを切り替えるには、web.configに次の行を追加します。

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
</system.serviceModel> 
+0

を使用しています私のWCFサービスが実行された物理パスでした。私はそこにxmlファイルを持っていて、それを読んでみたい。 Directory.GetCurrentDirectory()が動作しません。互換モードについての設定を試してみると、このエラーが発生します。 サーバーは意味のある返信をしませんでした。これは、契約の不一致、早すぎるセッションのシャットダウン、または内部サーバーのエラーによって引き起こされる可能性があります。 –

+0

テスト済みのサンプルコードで回答を更新しました。 –

+9

これは、ASPNETコンテキストまたはSystem.Web.Hosting.HostingEnvironment.MapPath( "〜/ folder/file")なしで動作します。 –

12

aspNetCompatibilityEnabled =「true」が私の問題を解決しているはずですが、私はこのエラーを得た:

The server did not provide a meaningful reply; this might be caused by a contract mismatch, a premature session shutdown or an internal server error.

私からそれを取得することにより、私の実行中のWCFサービスの物理パスを取得して私の問題を解決私の現在のアプリケーションドメイン:

AppDomain.CurrentDomain.BaseDirectory 
+1

ServiceHostを手動で実行すると、AppDomain.CurrentDomain.BaseDirectoryだけが正しいソースを指します。 Thx男! – mastak

20

あなたが望むものに応じて。私は通常、 "〜/ folder/file"のようなURLを解決したいと思っています。これがうまくいきました。

System.Web.Hosting.HostingEnvironment.MapPath("~/folder/file"); 
+0

ベスト回答! –

2

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

15

より一般的な、私は「作業フォルダ」を意味何この1

AppDomain.CurrentDomain.BaseDirectory 
+0

+1 System.Webのないソリューション – Filip

関連する問題