.NET - 在没有app.config的情况下部署WCF客户端

时间:2011-10-07 14:38:49

标签: .net wcf app-config

我正在为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块,我怎么知道要编写什么代码?

2 个答案:

答案 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服务的位置。

相关问题