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

Posted

技术标签:

【中文标题】如何获取 wcf 应用程序的工作路径?【英文标题】:How to get working path of a wcf application? 【发布时间】:2010-10-21 22:41:35 【问题描述】:

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

如果我尝试

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

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


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

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

【问题讨论】:

【参考方案1】:

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

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

一如既往,YMMV。

【讨论】:

这个解决方案最适合我 - 我建议使用它,而不是必须进行各种其他设置更改... 我没有 System.Web.Hosting ,我真的不知道为什么。 . . 感谢 ongle :) 我成功使用了 AppDomain :) @nXqd:您需要确保您没有选择框架的客户端配置文件版本。 这个答案拯救了我的一天。请使其成为公认的,因为并不总是首选使用 ASP.NET 兼容性。无论 ASP.NET 兼容性是打开还是关闭,这个都可以工作。【参考方案2】:

请看下面的 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 包含有关传入请求、传出响应等信息。

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

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

【讨论】:

我所说的“工作文件夹”是指运行 WCF 服务的物理路径。我在那里有一个 xml 文件,我想阅读它。 Directory.GetCurrentDirectory() 不起作用,当我尝试您所说的有关兼容模式的设置时,我收到此错误:服务器没有提供有意义的回复;这可能是由于合同不匹配、会话过早关闭或内部服务器错误造成的。 使用这个既适用于 ASPNET 上下文也适用于没有 System.Web.Hosting.HostingEnvironment.MapPath("~/folder/file"); 如果您必须在通过多线程调用的方法中访问 HttpContext.Current,则 AspNetCompatibilityMode 将不起作用。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

AppDomain.CurrentDomain.BaseDirectory

【讨论】:

+一个用于没有 System.Web 的解决方案【参考方案5】:

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

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

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

AppDomain.CurrentDomain.BaseDirectory

【讨论】:

如果您手动运行 ServiceHost,那么只有 AppDomain.CurrentDomain.BaseDirectory 指向正确的源。谢谢你!【参考方案6】:

为了引用 HttpContext 对象等 ASP.NET 功能,您需要在 ASP.NET 兼容模式下运行 WCF 应用程序。这个article 解释了如何做到这一点。

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于如何获取 wcf 应用程序的工作路径?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 MVC 应用程序发出的 WCF 服务调用中获取域\用户名?

如何获取 Qt 应用程序的当前工作目录路径?

获取/设置托管 WCF 服务的帐户

如何在 Objective-C 中获取当前工作目录的绝对路径?

WCF:如何从 ServiceHost 获取端点列表?

C#如何保证获取当前应用程序的绝对路径是对的?