我正在为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块,我怎么知道要编写什么代码?
答案 0 :(得分:38)
您可以使用以下代码创建配置正在执行的绑定。我不确定是否会让你完全删除文件,但如果是这种情况,应用程序将不会使用配置。把你自己的价值放在超时等等。
var binding = new WSHttpBinding();
binding.SendTimeout = new TimeSpan(0, 0, 0, 0, 100000);
binding.OpenTimeout = new TimeSpan(0, 0, 0, 0, 100000);
binding.MaxReceivedMessageSize = 10000;
binding.ReaderQuotas.MaxStringContentLength = 10000;
binding.ReaderQuotas.MaxDepth = 10000;
binding.ReaderQuotas.MaxArrayLength = 10000;
var endpoint = new EndpointAddress("http://localhost:57102/MyService.svc");
var myClient = new WebServiceclient(binding, endpoint);
答案 1 :(得分:-1)
可以在代码中设置WCF设置,而无需外部配置文件。地址,绑定,端点,安全性等都可以在代码中配置。这是在所有WCF服务中保持一致的最佳方式,不允许用户篡改这些设置。
我建议您向用户公开地址(主机名和端口号),并允许他们以某种方式对其进行配置,因为地址特定于托管WCF服务的位置。