如何获得一个wcf应用程序的工作path?

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

如果我尝试

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

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


我的工作文件夹的意思是我的WCF服务运行的文件夹。 如果我设置aspNetCompatibilityEnabled="true" ,我得到这个错误:

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

我需要为我的IIS6托pipe的WCF应用程序相同的信息,我发现这对我工作:

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

一如既往,YMMV。

请参阅下面的ongle的答案。 这比这个好多了。

更多信息后更新

以下为我工作。 我通过Service1.svc在IIS上托pipe的新WCF服务对其进行了testing。

  1. <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>到Webconfiguration中。 已经存在<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可以托pipe在IIS上,它仍然不是ASP.Net,因此大多数ASP.Net技术在默认情况下不起作用。 OperationContext是WCF的HttpContext的等价物。 OperationContext包含传入请求的信息,传出响应等等。

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

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

取决于你想要什么。 我通常要parsing一个像“〜/文件夹/文件”的url。 这是什么工作。

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

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

 AppDomain.CurrentDomain.BaseDirectory 

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

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

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

 AppDomain.CurrentDomain.BaseDirectory 

为了引用像HttpContext对象这样的ASP.NETfunction,您需要在ASP.NET兼容模式下运行您的WCF应用程序。 这篇文章解释了如何做到这一点。

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