69

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

如果我尝试

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

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


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

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

4

7 回答 7

173

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

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

一如既往,YMMV。

于 2009-06-02T21:49:42.873 回答
31

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

更多信息后更新

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

  1. 添加<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>到网络配置。<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>

旧答案

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

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

HttpContext 是一个 ASP.Net 对象。即使 WCF 可以托管在 IIS 上,它仍然不是 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>
于 2009-04-26T19:54:33.263 回答
21

取决于你想要什么。我通常想解析像“~/folder/file”这样的url。这是有效的。

System.Web.Hosting.HostingEnvironment.MapPath("~/folder/file");
于 2010-03-01T20:18:45.387 回答
19

更一般地说,我正在使用这个

AppDomain.CurrentDomain.BaseDirectory
于 2013-06-04T09:24:16.507 回答
12

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

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

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

AppDomain.CurrentDomain.BaseDirectory
于 2009-04-26T20:21:15.150 回答
3

为了引用 HttpContext 对象等 ASP.NET 功能,您需要在 ASP.NET 兼容模式下运行 WCF 应用程序。本文介绍了如何执行此操作。

于 2009-04-26T19:52:41.160 回答
2

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

于 2011-05-09T09:00:39.617 回答