如何获取WCF应用程序的工作路径?


69

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

如果我尝试

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

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


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

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

Answers:


173

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

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

与往常一样,YMMV。


2
此解决方案最适合我-我建议您使用它,而不必进行其他各种设置...
Sam Schutte

我没有System.Web.Hosting,我真的不知道为什么。。。
阮阮

谢谢ongle :)我成功使用了AppDomain :)
Dzung Nguyen 2010年

2
@nXqd:您需要确保尚未选择框架的“客户端配置文件”版本。
罗杰·利普斯科姆

这个答案挽救了我的一天。请使其成为可接受的,因为并非总是首选使用ASP.NET兼容性。无论打开或关闭ASP.NET兼容性,此功能都可以工作。
罗伊

31

请在下面查看ongle的答案。比这好得多。

更新后的更多信息

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

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

我所说的“工作文件夹”是我的WCF服务运行所在的物理路径。我在那里有一个xml文件,我想阅读它。Directory.GetCurrentDirectory()无法正常工作,当我尝试您说的关于兼容模式的设置时,出现此错误:服务器未提供有意义的答复。这可能是由于合同不匹配,会话过早关闭或内部服务器错误引起的。
Stefan Filip

9
使用既可以用于ASPNET上下文,也可以不用于System.Web.Hosting.HostingEnvironment.MapPath(“〜/ folder / file”)的此函数;
Simon_Weaver

如果必须使用通过多线程调用的方法访问HttpContext.Current,则AspNetCompatibilityMode将不起作用。
Anchit '02

20

根据您想要的。我通常想解析一个URL,例如“〜/ folder / file”。这是有效的。

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

18

更笼统地说,我正在用这个

AppDomain.CurrentDomain.BaseDirectory

+一个没有System.Web的解决方案
Filip 2015年

12

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

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

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

AppDomain.CurrentDomain.BaseDirectory

1
如果手动运行ServiceHost,则只有AppDomain.CurrentDomain.BaseDirectory指向正确的源。天哪!
mastak 2011年

3

为了引用HttpContext对象之类的ASP.NET功能,您需要以ASP.NET兼容模式运行WCF应用程序。该文章介绍了如何做到这一点。


2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.