【发布时间】:2011-12-03 01:54:38
【问题描述】:
我正在将客户端写入 WCF 服务。这是一个更大系统中的单个应用程序,包括用 C#、C++、VB 和 Java 编写的模块。所有应用程序都共享通用配置和日志记录机制,无论它们是用什么语言编写的。
我想弄清楚如何构建客户端应用程序,以便它可以在没有 app.config 的情况下运行。为什么?因为 app.config 中的大部分内容都是不应该允许系统管理员更改的样板文件,并且应该允许系统管理员更改的设置应该在系统范围的配置中,而不是在 app.config 文件中坐在 bin 目录中。
恰当的例子 - 客户端的 app.config 当前如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<customBinding>
<binding name="WSHttpBinding_ICourierService">
<security defaultAlgorithmSuite="Default" authenticationMode="SecureConversation"
...
</security>
<textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
messageVersion="Default" writeEncoding="utf-8">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647"
maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
</textMessageEncoding>
<httpTransport manualAddressing="false"
...
useDefaultWebProxy="true" />
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="http://localhost:57102/MyService.svc"
...
>
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>
这是一堆不透明的样板,系统管理员不应该处理。其中大部分是由 Visual Studio 插入的。我对文件进行了一项更改 - 我增加了 <readerQuotas/> 中的最大大小。但这是我不希望系统管理员搞砸的变化。除了<endpoint address=""/>,我希望系统管理员处理的文件中没有其他内容。
我正在从系统范围的配置中提取端点地址,并在代码中设置它。此文件中没有任何内容应该是用户可编辑的。
那么,我如何配置一些东西,这样我就不需要它了?
我可以将它作为资源嵌入到程序集中,并挂接到 app.config 加载过程中,就像我对所需 DLL 所做的那样吗?
创建代码来配置事物的唯一选择是我使用代码设置端点地址的方式吗?在代码中创建必要的绑定等?那么,鉴于这些不透明的 XML 块,我如何知道要编写什么代码?
【问题讨论】:
-
我认为系统管理员应该能够更改 WCF 服务设置之类的东西,我很傻。
-
什么样的设置?网址?当然。绑定?为什么?我正在构建一个客户端来与在 IIS 上运行的服务通信。无需允许系统管理员将绑定更改为 HTTP 以外的其他内容。
-
主机名以及与服务实际对话有关的任何事情。
-
如果我们希望系统管理员能够配置某个设置,我们会将其包含在我们的系统范围的配置机制中,列出可用的特定选项并记录每个选项的后果。我们不会将它嵌入到几页不透明且未记录的 XML 中。
标签: .net wcf app-config