2010-03-18 18 views
8

मेरे पास एक सिल्वरलाइट 3.0 एप्लिकेशन है जो डेटाबेस के साथ संवाद करने के लिए डब्ल्यूसीएफ सेवा का उपयोग कर रहा है, और जब मेरे पास सेवा विधियों से बड़ी मात्रा में डेटा लौटाया जाता है तो मुझे सेवा नहीं मिली त्रुटियां मिलती हैं। मुझे पूरा भरोसा है कि इसका समाधान केवल maxItemsInObjectGraph प्रॉपर्टी को अपडेट करना है, लेकिन मैं सेवा क्लाइंट प्रोग्राग्रामेटिक रूप से बना रहा हूं और यह नहीं कह सकता कि यह संपत्ति कहां सेट करें।मैं सिल्वरलाइट एप्लिकेशन से प्रोग्रामेटिक रूप से maxItemsInObjectGraph प्रॉपर्टी कैसे सेट कर सकता हूं?

BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.None) 
{ 
    MaxReceivedMessageSize = int.MaxValue,     
    MaxBufferSize = int.MaxValue 
};       

MyService.MyServiceServiceClient client = new MyService.MyServiceProxyServiceClient(binding, new EndpointAddress(new Uri(Application.Current.Host.Source, "../MyService.svc"))); 

उत्तर

28

यह बाध्यकारी में परिभाषित नहीं है, लेकिन सेवा व्यवहार में: यहाँ अभी मैं क्या कर रहा हूँ है।

सिल्वरटाइट में, maxItemsInObjectGraph int.MaxValue पर डिफ़ॉल्ट है।

यहाँ कैसे .NET अनुप्रयोग के लिए इसे बदलने के लिए पर एक लेख है, लेकिन Silverlight नहीं है: Programattically setting the MaxItemsInObjectGraph property in client

कोड का एक टुकड़ा:

protected ISecurityAdministrationService GetSecAdminClient() 
{ 
    ChannelFactory<ISecurityAdministrationService> factory = new ChannelFactory<ISecurityAdministrationService>(wsSecAdminBinding, SecAdminEndpointAddress); 
    foreach (OperationDescription op in factory.Endpoint.Contract.Operations) 
    { 
     DataContractSerializerOperationBehavior dataContractBehavior =op.Behaviors.Find<DataContractSerializerOperationBehavior>() as DataContractSerializerOperationBehavior; 
     if (dataContractBehavior != null) 
     { 
      dataContractBehavior.MaxItemsInObjectGraph = 2147483647; 
     } 
    } 
    ISecurityAdministrationService client = factory.CreateChannel(); 
    return client; 
} 
+0

मैंने इसे देखा है, लेकिन किसी कारण से ऑपरेशन डिस्क्रिप्शन में व्यवहार की संपत्ति नहीं है। –

+0

मैं देखता हूं। मुझे लगता है क्योंकि ग्राहक एक Silverilght अनुप्रयोग है, System.ServiceModel.dll .NET एक से अलग है। लेकिन SilverContractSerializer maxItemsInObjectGraph सिल्वरलाइट पर int.MaxValue पर डिफ़ॉल्ट है। क्या आप इसे अपने कोड में एक छोटे से मूल्य पर सेट करने जा रहे हैं? – erxuan

+0

नहीं। शायद यह मेरे हिस्से पर एक गलतफहमी थी, लेकिन मैंने सोचा कि यह int.MaxValue के बाद काफी कम हो गया है। मेरे पास एएसपीएक्स पेज हैं जो डब्ल्यूसीएफ सेवाओं का इस्तेमाल करते थे और इसी तरह की समस्या थी, और मैं web.config में maxItemsInObjectGraph को 2147483646 पर संशोधित करने में सक्षम था और यह समस्या को ठीक करता था। –

1

बदलें प्रत्येक endpoint के लिए अपने WCF सेवा में maxItemsInObjectGraph , सिल्वरलाइट में इसे बदलने का मतलब है कि ग्राहक व्यवहार का समर्थन करने में सक्षम होगा, लेकिन सेवा को भी इसका समर्थन करना चाहिए।

आपकी सेवा में यह बदलने के बाद, प्रॉक्सी/अद्यतन वेब सेवा को पुनर्जीवित, और आप एक नया ServiceReference.config, कि नए maxItemsInObjectGraph मूल्य

+0

सेवा पहले ही अपडेट हो चुकी है। समस्या यह है कि सर्विस सेटिंग्स में कॉन्फ़िगरेशन कॉन्फ़िगरेशन कॉन्फ़िगरेशन में कॉन्फ़िगर किया गया है, जब मैं क्लाइंट को कोड में सेट करता हूं। –

3

निम्नलिखित शामिल होंगे मिल जाएगा एक समारोह है कि मैं का उपयोग किया है है एक ग्राहक उद्देश्य यह है कि से

System.ServiceModel.ClientBase(Of IServiceName) 

विरासत के अंदर विधि के प्रयोजन के प्रोग्राम के प्रत्येक ऑपरेशन के लिए MaxItemsInObjectGraph मान सेट करने के लिए है। यह मुझे और अधिक जटिल संरचनाओं की अनुमति देता है।

Private Sub IncreaseObjectCount() 
     For Each op As System.ServiceModel.Description.OperationDescription In Me.Endpoint.Contract.Operations 
      For Each dscob As System.ServiceModel.Description.DataContractSerializerOperationBehavior In op.Behaviors.FindAll(Of System.ServiceModel.Description.DataContractSerializerOperationBehavior)() 
       dcsob.MaxItemsInObjectGraph = Integer.MaxValue 
      Next dcsob 
     Next op 
    End Sub 

मैं आमतौर पर इसे ऑब्जेक्ट के निर्माता में कॉल करता हूं।

संबंधित मुद्दे

 संबंधित मुद्दे