如何获取 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 服务调用中获取域\用户名?