最近我决定将现有的asmx服务移植到WCF。我现在已经创建了一个包含WCF服务库的新解决方案(最终将从WCF Web站点引用)。
我的旧代码在很大程度上依赖于HTTPContext,但我的理解是,它失败了WCF服务的观点,它本质上可以从任何上下文运行,从控制台应用程序到MS Outlook插件的任何东西(确实有点极端,但是你明白了。
在我在web.config中进行配置之前,我现在仍然将配置保留在那里,或者更多地保存到WCF服务Libraries App.Config。
使用WCF网站,现在有一种更通用的方式来引用路径,不是基于HTTPContext,而是基于App Execution路径,这样我可以编写一次可以在任何地方运行的代码吗? (注意:过去在asmx app执行路径中是bin目录)。
总结一下这里的问题是:
答案 0 :(得分:2)
配置存储在托管WCF服务的进程的配置文件中。因此,这意味着在您的方案中,您将在引用和托管服务的网站的web.config中包含WCF配置。如果您要运行单元测试,则必须在测试程序集的app.config中包含该配置。
您始终可以检查当前正在执行的程序集的位置,然后使用相对路径从那里开始工作。您可以致电:
获取位置Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
答案 1 :(得分:1)
- 存储配置值的最佳位置在哪里, 在WCF网站的web.config中或在WCF服务库的app.config中?
醇>
这取决于您的托管选择:
服务库(DLL程序集)没有自己的配置文件 - 您需要将配置放入托管应用程序的配置中。
- 如何摆脱使用HTTPContext的亲戚 文件的位置,并实现更通用的方法, 因此,为了更好地利用WCF服务在任何地方运行。
醇>
我会尝试配置(例如在你的web.config / app.config中)一个“基本目录”,然后用它来查找你的文件,例如
<appSettings>
<add key="BaseDirectory" value="D:\MyFiles" />
</appSettings>
这样的东西应该可以正常工作,让你摆脱HttpContext的束缚: - )
马克
答案 2 :(得分:1)
问题1
Marc_s说:
web.config
文件中。app.config
文件中。它有点令人困惑,因为WCF允许您将托管,合同和实现集中在同一个项目中或分散在不同的项目中。请记住,无论主机类型和实施代码的位置如何,配置数据(和数据文件)总是进入主机项目。
问题2
这些方面的东西应该可以解决问题。即使您的代码没有有效的HttpRuntime
,这些HttpContext
属性也会返回IIS托管应用的有效信息。
static string GetDataFilePath() {
string path;
if(HttpRuntime.AppDomainAppVirtualPath != null) {
// We are hosted in IIS, so the data files are in the virtual directory's data folder.
path = Path.Combine(HttpRuntime.AppDomainAppPath, "App_Data");
} else {
// We are hosted in an application, so the data files are in the same directory as the assembly.
path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
}
return path ?? string.Empty;
}
App_Data
文件夹中,并设置CopyToOutputDirectory = DoNotCopy。