2011-10-07 121 views
21

我正在將客戶端寫入WCF服務。這是一個包含以C#,C++,VB和Java編寫的模塊的較大系統中的單個應用程序。所有的應用程序共享常見的配置和日誌記錄機制,不管他們寫的。.NET - 部署WCF客戶端,無需app.config

我想弄清楚如何構建客戶端應用程序,使其沒有一個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

有我思考SysAdmins應該能夠改變像WCF服務setttings,愚蠢的我。 – ChrisBint

+1

什麼樣的設置?網址是什麼?當然。綁定?爲什麼?我正在構建一個客戶端來與在IIS上運行的服務進行交談。沒有必要允許系統管理員將綁定更改爲除HTTP之外的其他內容。 –

+0

主機名和任何與服務實際交談的事情如何? – ChrisBint

回答

36

您可以使用下面的代碼來創建綁定,這是配置正在做的事情。我不確定這是否會讓你完全刪除文件,但如果是這種情況,應用程序將不會使用該配置。把你自己的價值在超時等

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

我想這樣做,但我得到一個錯誤:「無法處理消息,因爲內容類型'text/xml; charset = utf-8'不是預期的類型'application/soap + xml; charset = utf -8'' –

+4

嘗試將綁定創建行更改爲:var binding = new BasicHttpBinding(); – Graymatter

+0

你會把這個代碼放在哪裏,global.asax?單元測試? – PositiveGuy

-1

WCF設置可以在代碼中設置,不需要外部配置文件。地址,綁定,端點,安全等都可以在代碼中配置。這是在所有WCF服務中保持一致的最佳方式,並且不允許用戶篡改這些設置。

我建議你揭露地址(主機名和端口號)給用戶,並允許因爲地址是特定於您的WCF服務託管他們以某種方式進行配置。

+3

他們可以在我的代碼中設置並不意味着很容易找出如何在我的代碼中設置它們。 –

+0

你有幾個選項來弄清楚如何在代碼中設置WCF設置:(1)瀏覽相關的MSDN頁面。 (2)獲得關於WCF的好書,例如_編程WCF Services_。 (3)參見[this](http://stackoverflow.com/questions/54579/wcf-configuration-without-a-config-file)問題的一些指導。 – Bernard

+0

在代碼中,什麼文件,global.asax? – PositiveGuy