2011-06-08 140 views
5

我在服務器配置文件中指定了maxItemsInObjectGraph,但在創建客戶端配置文件時忽略了該屬性,我必須手動將其添加到endpointBehaviors部分。在客戶端配置中設置maxItemsInObjectGraph

有沒有辦法可以在配置文件中進行一些更改,以便每次我通過Svcutil.exe生成客戶端配置和代理時,此行爲會自動包含在客戶端配置文件中?

我試圖ading [ServiceBehavior(MaxItemsInObjectGraph = 2147483647)]服務接口,但它給了我一個錯誤說Attribute 'ServiceBehavior' is not valid on this declaration type. It is only valid on 'class' declarations.

回答

7

沒有,那就是:對每個參與者配置的其他行爲。每個客戶端都擁有對此屬性的控制權,並且服務不公開此屬性,因爲它可能被視爲安全問題。

如果您的問題主要是關於發展(您不希望每次刷新參考時間來修改自己的行爲),可以使用commonBehaviors部分只能在machine.config中定義:

<commonBehaviors> 
    <behaviors> 
    <endpointBehaviors> 
     <dataContractSerializer maxItemsInObjectGraph="..." /> 
    </endpointBehaviors> 
    </behaviors> 
</commonBehaviors> 

將常見行爲添加到機器上運行的每個服務/端點。這對於開發來說可能是有益的,但是你不要忘記,一旦你準備生產包,你將不得不將這個配置添加到生產配置文件中 - 因爲這樣可以更好地維護這樣的配置文件,並在一些構建中使用它/測試服務器。

+0

我的主要問題是將該屬性添加到每個客戶端配置文件。看起來我必須忍受它。 – Asdfg 2011-06-08 18:38:41

8

行爲通常是本地設置(您可以爲客戶端和服務器設置不同的值,並且通信仍然可以正常工作),因此它們不在WSDL中公開(因此svcutil將無法找到該值)。

基本上有兩種選擇:每次生成或在代碼中更新客戶端配置,當您創建代理類的實例時,更新MIIOG屬性,類似於下面的代碼。

ServiceClient client = new ServiceClient(); 
foreach (var operationDescription in client.Endpoint.Contract.Operations) 
{ 
    DataContractSerializerOperationBehavior dcsob = 
     operationDescription.Behaviors.Find<DataContractSerializerOperationBehavior>(); 
    if (dcsob != null) 
    { 
     dcsob.MaxItemsInObjectGraph = int.MaxValue; 
    } 
} 

請注意,如果你是手寫的客戶端實現的,而不是使用自動生成的存根,端點是可以通過的ChannelFactory用於創建服務接口的通道。

+0

這是一個很好的解決方法,出於某種原因,我的app.config沒有監聽我的xml指示,所以這是我的最佳選擇。 – 2013-01-28 18:33:09

+0

我一整天都在苦苦掙扎,這是解決問題的唯一解決方案。真誠的感謝! – KenD 2014-05-10 15:25:05