WCF:在何处放置配置以及如何在没有HTTPContext的情况下解析相对路径

时间:2009-10-05 09:44:41

标签: wcf

最近我决定将现有的asmx服务移植到WCF。我现在已经创建了一个包含WCF服务库的新解决方案(最终将从WCF Web站点引用)。

我的旧代码在很大程度上依赖于HTTPContext,但我的理解是,它失败了WCF服务的观点,它本质上可以从任何上下文运行,从控制台应用程序到MS Outlook插件的任何东西(确实有点极端,但是你明白了。

在我在web.config中进行配置之前,我现在仍然将配置保留在那里,或者更多地保存到WCF服务Libraries App.Config。

使用WCF网站,现在有一种更通用的方式来引用路径,不是基于HTTPContext,而是基于App Execution路径,这样我可以编写一次可以在任何地方运行的代码吗? (注意:过去在asmx app执行路径中是bin目录)。

总结一下这里的问题是:

  1. 存储配置值的最佳位置在哪里,在WCF网站的web.config中或在WCF服务库的app.config中?
  2. 如何摆脱使用HTTPContext来获取文件的相对位置,并实现更通用的方法,以便更好地利用WCF服务在任何地方运行。

3 个答案:

答案 0 :(得分:2)

  1. 配置存储在托管WCF服务的进程的配置文件中。因此,这意味着在您的方案中,您将在引用和托管服务的网站的web.config中包含WCF配置。如果您要运行单元测试,则必须在测试程序集的app.config中包含该配置。

  2. 您始终可以检查当前正在执行的程序集的位置,然后使用相对路径从那里开始工作。您可以致电:

    获取位置
    Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    

答案 1 :(得分:1)

  
    
        
  1. 存储配置值的最佳位置在哪里,     在WCF网站的web.config中或在WCF服务库的app.config中?
  2.        

这取决于您的托管选择:

  • 如果您在IIS中托管WCF服务,那么存储配置的最佳位置确实是您的web.config
  • 如果您进行自托管,例如在NT服务,控制台应用程序或其他东西中托管您的WCF服务,然后将WCF配置放入该主机应用程序的app.config

服务库(DLL程序集)没有自己的配置文件 - 您需要将配置放入托管应用程序的配置中。

  
    
        
  1. 如何摆脱使用HTTPContext的亲戚     文件的位置,并实现更通用的方法,     因此,为了更好地利用WCF服务在任何地方运行。
  2.        

我会尝试配置(例如在你的web.config / app.config中)一个“基本目录”,然后用它来查找你的文件,例如

<appSettings>
  <add key="BaseDirectory" value="D:\MyFiles" />
</appSettings>

这样的东西应该可以正常工作,让你摆脱HttpContext的束缚: - )

马克

答案 2 :(得分:1)

问题1

Marc_s说:

  • 如果您的主机是虚拟目录(IIS,VSDS,WAS等),则配置值将放在主机的web.config文件中。
  • 如果您的主机是应用程序(WinForms,WPF,服务,控制台等),则配置值将放在主机的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。
  • 如果您的主机是应用程序,则将您的数据文件放在主机项目的根目录中并设置CopyToOutputDirectory = CopyAlways。