我想获取WCF应用程序的工作文件夹。我怎么才能得到它?
如果我尝试
HttpContext.Current.Request.MapPath(HttpContext.Current.Request.ApplicationPath)
我得到一个空引用异常(Http.Current对象为null)。
我对工作文件夹的意思是我的WCF服务正在运行的文件夹。如果我设置aspNetCompatibilityEnabled="true"
,我会收到此错误:
服务器未提供有意义的回复;这可能是由于合同不匹配,过早的会话关闭或内部服务器错误造成的。
答案 0 :(得分:169)
我需要为IIS6托管的WCF应用程序提供相同的信息,我发现这对我有用:
string apPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
一如既往,YMMV。
答案 1 :(得分:31)
请参阅下面的ongle的答案。它比这个要好得多。
更多信息后更新
以下对我有用。我使用通过Service1.svc在IIS上托管的新WCF服务对其进行了测试。
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
添加到网络配置。 <system.serviceModel>..</ ..>
已经存在。AspNetCompatibilityRequirementsAttribute
添加到具有“允许模式”的服务中。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>
答案 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;