如何获得wcf应用程序的工作路径?

Ste*_*lip 68 wcf path httpcontext

我想获取WCF应用程序的工作文件夹.我怎么才能得到它?

如果我试试

HttpContext.Current.Request.MapPath(HttpContext.Current.Request.ApplicationPath)
Run Code Online (Sandbox Code Playgroud)

我得到一个空引用异常(Http.Current对象为null).


我对工作文件夹的意思是我的WCF服务正在运行的文件夹.如果我设置aspNetCompatibilityEnabled="true",我收到此错误:

服务器没有提供有意义的回复; 这可能是由于合同不匹配,过早的会话关闭或内部服务器错误造成的.

Don*_*yrd 171

我需要为IIS6托管的WCF应用程序提供相同的信息,我发现这对我有用:

string apPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
Run Code Online (Sandbox Code Playgroud)

一如既往,YMMV.

  • 这个解决方案最适合我 - 我建议使用它而不是必须进行各种其他设置更改... (2认同)
  • @nXqd:您需要确保没有选择框架的Client Profile版本. (2认同)

Mik*_*nen 31

请参阅下面的ongle的答案.它比这个要好得多.

更多信息后更新

以下对我有用.我使用通过Service1.svc在IIS上托管的新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(".");
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是web.config的摘录.

<system.serviceModel>
    <!-- Added only the one line below -->
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

    <!-- Everything else was left intact -->
    <behaviors>
        <!-- ... -->
    </behaviors>
    <services>
        <!-- ... -->
    </services>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)

老答案

工作文件夹是什么意思?WCF服务可以以多种不同的方式托管,并且具有不同的端点,因此工作文件夹略微模糊.

您可以通过调用Directory.GetCurrentDirectory()来检索正常的"工作文件夹" .

HttpContext是一个ASP.Net对象.即使WCF可以在IIS上托管,它仍然不是ASP.Net,因此大多数ASP.Net技术默认不起作用.OperationContext是WCF与HttpContext的等价物.OperationContext包含有关传入请求,传出响应等信息.

虽然最简单的方法是在ASP.Net兼容模式下通过在web.config中切换它来运行服务.这应该可以让您访问ASP.Net HttpContext.它会限制你到*HttpBindings和IIS托管.要切换兼容模式,请将以下内容添加到web.config中.

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)

  • 使用它既可以使用ASPNET上下文,也可以不使用System.Web.Hosting.HostingEnvironment.MapPath("〜/ folder/file"); (9认同)

小智 20

取决于你想要的.我通常想要解析像"〜/ folder/file"这样的网址.这是有效的.

System.Web.Hosting.HostingEnvironment.MapPath("~/folder/file");
Run Code Online (Sandbox Code Playgroud)


Kho*_*yen 18

更一般的,我正在使用这个

AppDomain.CurrentDomain.BaseDirectory
Run Code Online (Sandbox Code Playgroud)


Ste*_*lip 12

aspNetCompatibilityEnabled ="true"应该已经解决了我的问题,但是我收到了这个错误:

服务器没有提供有意义的回复; 这可能是由于合同不匹配,过早的会话关闭或内部服务器错误造成的.

我通过从当前应用程序域获取运行WCF服务的物理路径解决了我的问题:

AppDomain.CurrentDomain.BaseDirectory
Run Code Online (Sandbox Code Playgroud)