如何获得一个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。
- 将
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
到Webconfiguration中。 已经存在<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可以托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使用命名空间;