代码之家  ›  专栏  ›  技术社区  ›  JL. Hans Passant

wcf:在何处放置配置以及如何在不使用httpcontext的情况下解析相对路径

wcf
  •  3
  • JL. Hans Passant  · 技术社区  · 15 年前

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

    我的旧代码严重依赖于httpcontext,但我的理解是,这违背了wcf服务的本质,wcf服务可以从任何上下文运行,从控制台应用程序到MS Outlook插件都可以(好吧,有点极端,但你知道这一点)。

    在web.config中进行配置之前,我现在是否仍将配置保留在那里,或者将其保存到wcf服务库app.config中。

    对于一个WCF网站,现在是否有一种更通用的方法来引用路径,而不是基于httpContext,而是应用程序执行路径,这样我就可以在任何地方运行一次代码了?(注意:在过去的asmx app中,执行路径是bin目录)。

    因此,总结如下问题:

    1. 在wcf网站的web.config或wcf服务库的app.config中,存储配置值的最佳位置在哪里?
    2. 我如何才能避免使用httpcontext进行文件的相对位置,并实现一种更通用的方法,以便更好地利用在任何地方运行wcf服务的优势。
    3 回复  |  直到 11 年前
        1
  •  2
  •   Randy Levy    13 年前
    1. 配置存储在承载WCF服务的进程的配置文件中。因此,这意味着在您的场景中,您将在引用和托管服务的网站的web.config中包含wcf配置。如果要运行单元测试,则必须在测试程序集的app.config中包含该配置。

    2. 您总是可以检查当前正在执行的程序集的位置,然后使用相对路径从那里开始工作。您可以通过以下方式获得位置:

      Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
      
        2
  •  1
  •   marc_s dmck    15 年前
    1. 存储配置值的最佳位置在哪里? 在wcf网站的web.config或wcf服务库的app.config中?

    这取决于您的主机选择:

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

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

    1. 如何避免使用httpcontext作为relative 文件的位置,并实现更通用的方法, 因此,为了更好地利用在任何地方运行WCF服务的优势。

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

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

    类似的东西应该可以很好地工作,并将您从HTTPContext的束缚中解放出来:—)

    马克

        3
  •  1
  •   Christian Hayter    15 年前

    问题1

    马库斯说的:

    • 如果您的主机是虚拟目录(IIS、VSD、WAS等),那么配置值将进入主机的 web.config 文件。
    • 如果您的主机是应用程序(winforms、wpf、service、console等),那么配置值将进入主机的 app.config 文件。

    它会变得有点混乱,因为WCF允许您将宿主、契约和实现挤在同一个项目中,或者分散在不同的项目中。只要记住,无论主机类型和实现代码位于何处,配置数据(和数据文件) 总是 进入宿主项目。

    问题2

    沿着这些线的某些东西应该会起作用。这些 HttpRuntime 即使您的代码没有有效的 HttpContext .

    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。
    • 如果您的主机是一个应用程序,那么将您的数据文件放在主机项目的根目录中,并设置copytooputdirectory=copyAlways。