2010-03-18 7 views
8

Tôi có một ứng dụng Silverlight 3.0 đang sử dụng dịch vụ WCF để giao tiếp với cơ sở dữ liệu và khi tôi có một lượng lớn dữ liệu được trả về từ các phương thức dịch vụ, tôi nhận được lỗi Dịch vụ không tìm thấy. Tôi khá tự tin rằng giải pháp cho nó là chỉ cần cập nhật các thuộc tính maxItemsInObjectGraph, nhưng tôi đang tạo ra các khách hàng dịch vụ progrogrammatically và không thể tìm thấy nơi để thiết lập tài sản này. Đây là những gì tôi đang làm ngay bây giờ:Làm cách nào tôi có thể đặt thuộc tính maxItemsInObjectGraph theo chương trình từ Ứng dụng Silverlight?

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

Trả lời

28

Nó không được định nghĩa trong ràng buộc, nhưng trong hành vi dịch vụ.

Trong Silveright, maxItemsInObjectGraph mặc định thành int.MaxValue.

Dưới đây là một bài viết về cách thay đổi nó cho các ứng dụng .NET, nhưng không Silverlight: Programattically setting the MaxItemsInObjectGraph property in client

Một đoạn mã:

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

Tôi đã xem xét điều đó, nhưng vì lý do nào đó, OperationDescription không có thuộc tính Hành vi. –

+0

Tôi hiểu. Tôi đoán vì khách hàng là một ứng dụng Silverilght, System.ServiceModel.dll khác với .NET. Nhưng DataContractSerializer maxItemsInObjectGraph trên Silverlight mặc định là int.MaxValue. Bạn sẽ đặt nó thành một giá trị nhỏ hơn trong mã của bạn? – erxuan

+0

Không. Có lẽ đây là một sự hiểu lầm về phía tôi, nhưng tôi nghĩ rằng nó được mặc định là ít hơn nhiều so với int.MaxValue. Tôi đã có các trang aspx sử dụng dịch vụ WCF và đã có một vấn đề tương tự, và tôi đã có thể sửa đổi các maxItemsInObjectGraph trong web.config là 2147483646 và nó cố định vấn đề. –

1

Thay đổi maxItemsInObjectGraph phục vụ WCF của bạn cho mỗi thiết bị đầu cuối , thay đổi nó trong Silverlight có nghĩa là khách hàng sẽ có thể hỗ trợ hành vi, nhưng dịch vụ phải hỗ trợ nó.

Sau khi thay đổi nó trong dịch vụ của bạn, tái tạo các dịch vụ web proxy/cập nhật, và bạn sẽ nhận được một ServiceReference.config mới, mà sẽ bao gồm giá trị maxItemsInObjectGraph mới

+0

Dịch vụ đã được cập nhật. Vấn đề là tất cả các thiết lập được đưa vào ServiceReference.config bị bỏ qua khi tôi thiết lập máy khách trong mã. –

3

Sau đây là một chức năng mà tôi đã sử dụng bên trong một đối tượng khách hàng được kế thừa từ

System.ServiceModel.ClientBase(Of IServiceName) 

Mục đích của phương pháp này là thiết lập giá trị MaxItemsInObjectGraph cho từng hoạt động. Điều này cho phép tôi có nhiều cấu trúc phức tạp hơn.

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 

Tôi thường gọi nó trong hàm tạo của đối tượng.