【问题标题】:WCF configuration fileWCF 配置文件
【发布时间】:2012-11-20 21:08:10
【问题描述】:

我创建了一个 WCF 服务,基本上它与我的数据库进行了一些交互。 该服务在一个项目中,它从我在另一个项目中创建的库中调用函数。 在我将调用 WCFSerivceLibrary 的库中,我还有一个 app.config,我想在 AppSettings 部分中提取一些存储的值。

问题是,当我从某个客户端调用我的 WCF 服务,并且在 WCFServiceLibrary 中执行一个函数时,每当我调用 AppSettings 时,它都会检查配置 调用客户端的文件!

进一步说明: 假设我们有一个 Windows 窗体应用程序,它以这种方式调用我的 WCF 服务:

MyWCFService.DoWork();

在我的 WCF 服务的 DoWork 函数中,我有以下代码:

Type DoWork ()
{
  //MyWCFServiceLibrary is a library in the same solution of the WCF Service.
  MyWCFServiceLibrary.DoWorkOne(); 
  MyWCFServiceLibrary.DoWorkTwo();
}

在函数 DoWorkOneDoWorkTwo... 我调用 AppSettings 以获取存储在 MyWCFServiceLibrary 项目的 app.config 中的一些值,但是,在执行时,AppSettings 是从 app.cofing 加载的我的 Windows 窗体客户端调用 WCF 服务。

  1. 如何避免上述问题?
  2. 我可以为我的 WCF 服务和服务库提供一个配置文件吗?
  3. 如何在两者之间共享?

【问题讨论】:

  • 库项目中不能有app.config 文件——它将被忽略。
  • 您需要将库的app.config中的设置复制到使用该库的程序的app.config。然后,配置机制按预期工作。
  • “问题是当我从某个客户端调用我的 WCF 服务,并且在 WCFServiceLibrary 中执行一个函数时,每当我调用 AppSettings 时,它都会检查调用客户端的配置文件! " - 请说明你的意思,最好用代码。
  • 对我来说,这听起来像是 op 想要将服务器端 app.config 暴露给客户端 ....
  • @CodeCaster 请检查我的编辑

标签: c# wcf app-config


【解决方案1】:

我在下面写下我的意思是复制配置。但我不认为这是问题所在。问题可能是您甚至没有进行 WCF 通信。我怀疑您在服务项目和客户端项目中都包含了 DLL,并且您只是从客户端调用类上的方法。

进行 WCF 通信,您需要让 WCF 服务运行(例如,使用端点创建 ServiceHost 的 EXE)。然后在客户端中,使用 Visual Studio 的“添加服务引用”菜单项添加服务引用。

无需在客户端中包含 DLL,因为会自动生成类以通过 WCF 访问服务。

现在正确使用应用程序设置:

将 DLL 的 app.config 文件的应用程序设置复制到使用 DLL 的可执行项目的 app.config 文件中。例如,这可能看起来像这样:

<?xml version="1.0"?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="Executable.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
            <section name="DLL.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />        
        </sectionGroup>
    </configSections>

  <applicationSettings>
      <Executable.Properties.Settings>
          <setting name="Test" serializeAs="String">
              <value>Testvalue EXE</value>
          </setting>
      </Executable.Properties.Settings>
      <DLL.Properties.Settings>
          <setting name="Test" serializeAs="String">
              <value>Testvalue DLL</value>
          </setting>
      </DLL.Properties.Settings>
    </applicationSettings>
</configuration>

之后,应用程序可以通过Properties.Settings.Default.Test(返回Testvalue EXE)访问其设置,DLL 可以通过Properties.Settings.Default.Test(返回Testvalue DLL)访问其设置。

我不明白为什么人们需要使用像 ConfigurationManager 这样的东西,而实际上它真的很简单......

【讨论】:

  • 您的假设假设我很愚蠢.. 实际上我不是.. 我明确表示我正在调用托管在 Windows 服务中的 WCF 服务,是的,我确实有一个服务参考到我的客户项目中的 WCF。
  • 我并不是要暗示你很愚蠢,我不认为你是,因为无论我们多么有经验,我们有时都会犯最严重的错误。但是,要访问客户端配置的唯一可能解决方案是访问配置的类作为客户端的一部分运行。
  • 但我的问题完全相反,当实际预期的配置是WCF服务调用的库项目中的配置文件时,正在访问客户端配置。
  • 当您在 Visual Studio 中为库项目添加设置时,库项目可以具有配置文件。但是当正在运行的程序使用该库时,它不会读取文件。这导致了经常引用的“DLL 项目不能有配置文件”。唯一的方法是复制我上面描述的配置。事实仍然存在:由于客户端配置没有通过 WCF 传输到服务器,因此使用来自客户端配置的值的唯一方法是您没有进行 WCF 调用。
  • 该库由承载 WCF 服务的可执行文件使用,对吧?在这种情况下,您必须将库的配置复制到可执行文件app.config 中,如上所述。但是,如果服务和库都需要相同的设置,则必须在服务可执行文件的设置部分中设置一次,在库的设置部分中设置一次。
猜你喜欢
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 2016-08-17
  • 2012-02-04
  • 1970-01-01
相关资源
最近更新 更多