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

时间:2009-04-26 19:43:34

标签: wcf path httpcontext

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

如果我尝试

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

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


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

  

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

7 个答案:

答案 0 :(得分:169)

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

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

一如既往,YMMV。

答案 1 :(得分:31)

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

更多信息后更新

以下对我有用。我使用通过Service1.svc在IIS上托管的新WCF服务对其进行了测试。

  1. <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>添加到网络配置。 <system.serviceModel>..</ ..>已经存在。
  2. AspNetCompatibilityRequirementsAttribute添加到具有“允许模式”的服务中。
  3. 使用HttpContext.Current.Server.MapPath(".");获取根目录。
  4. 以下是服务类的完整代码。我没有在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>
    

答案 2 :(得分:20)

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

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

答案 3 :(得分:18)

更一般,我正在使用这个

AppDomain.CurrentDomain.BaseDirectory

答案 4 :(得分:12)

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

  

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

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

AppDomain.CurrentDomain.BaseDirectory

答案 5 :(得分:3)

为了引用像HttpContext对象这样的ASP.NET功能,您需要在ASP.NET兼容模式下运行WCF应用程序。这个article解释了如何执行此操作。

答案 6 :(得分:2)

在WCF中使用HostingEnvironment.ApplicationPhysicalPath查找应用程序物理路径。 使用命名空间 使用System.Web.Hosting;