簡體   English   中英

通過配置文件更改運行時構造的WCF綁定的默認設置

[英]Change defaults for runtime-constructed WCF bindings via config file

我們有一個WCF客戶端應用程序,它與一系列暴露相同合同的一系列不同服務終結點進行對話(基本上,是針對不同后端的代理服務)。 因為直到運行時我們才知道端點URL,所以我們像這樣動態創建服務代理類:

public Factory()
{
    this.ProxyFactory = new ChannelFactory<IProxyServiceChannel>(new BasicHttpBinding());
}

public IProxyServiceChannel GetProxy(Uri uri)
{
    return this.ProxyFactory.CreateChannel(new EndpointAddress(uri));
}

除某些情況下代理發送的數據大於默認的最大接收端64k的數據外,此方法還可以。 通常,我們只是進入配置文件並更改基本HTTP綁定以允許更大的消息。 在WCF 4.0及更高版本中,我們通常在默認(未命名)綁定上執行此操作,如下所示:

        <basicHttpBinding>
            <binding maxReceivedMessageSize="2147483647" 
                     sendTimeout="00:10:00" 
                     receiveTimeout="00:10:00">
                <readerQuotas maxArrayLength="2147483647" />
            </binding>
        </basicHttpBinding>

像這樣更改默認綁定設置適用於我們在應用程序中托管的任何服務,以及通過“新服務參考...”創建的任何服務代理。 但是由於某種原因,我們提供給我們的通道工廠的new BasicHttpBinding()對象沒有采用這些設置,而是恢復為內置默認值。

我假定這些綁定設置將使用沒有指定更具體綁定配置的BasicHttpBinding應用於任何端點。 那是對的嗎? 如果沒有,是否有辦法讓WCF自動選擇這些默認值?

注:我知道我可以為綁定指定一個名稱,並在代碼中使用該名稱,這是我目前正在追求的選項,但是由於各種技術原因,我不想這樣做。)

new BasicHttpBinding()將為您提供具有默認值的BasicHttpBinding實例-我認為它不會從配置文件(甚至是默認配置)中讀取任何內容,除非傳入了配置節名稱(這對配置文件中定義的默認綁定)。 您要做的是創建實例並將其傳遞給ChannelFactory。 像這樣:

BasicHttpBinding binding = new BasicHttpBinding();
binding.MaxReceivedMessageSize = Int32.Max;
binding.SendTimeOut = new Timespan();
binding.ReceiveTimeout = new TimeSpan();

XmlDictionaryReaderQuotas quotas = new XmlDictionaryReaderQuotas();
quotas.MaxArrayLength = Int32.Max;

binding.ReaderQuotas = quotas;

this.ProxyFactory = new ChannelFactory<IProxyServiceChannel>(binding);

您可以重構上面的內容,以便可以通過代碼生成任意數量的綁定配置(例如,每個綁定配置一個方法)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM