Dot-Net

.NET - 部署 WCF 客戶端,沒有 app.config

  • October 7, 2011

我正在將客戶端寫入 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 塊,我如何知道要編寫什麼程式碼呢?

您可以使用以下程式碼來創建配置正在執行的綁定。我不確定這是否會讓您完全刪除該文件,但如果是這種情況,應用程序將不會使用該配置。將您自己的值放入超時等中。

   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);

引用自:https://stackoverflow.com/questions/7688798