WCF异常 - 检索大型集合时“未找到服务”

时间:2009-03-30 12:01:25

标签: wcf silverlight web-services

我的WCF服务,Silverlight应用程序使用它来检索数据。我没问题,

    [OperationContract]
MyCollectionClass GetList(int sessID, string name);

  [CollectionDataContract]
public class MyCollectionClass : List<MyClass>{ }

  [DataContract]
public class MyClass {

  [DataMember]
  public string Prop1 { get; set; }

  [DataMember]
  public string Prop2 { get; set; }

}

但是..当MyCollectionClass有一个不到3000+的“记录”时,它可以工作。当记录数量更大时,WCF服务似乎有效,但在Silverlight应用程序的已完成事件上会发生异常:“找不到服务”。
我发现这可能与服务配置有关,我试图同时使用它们:

maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647"

在WCF和客户端配置上。还添加:

readerQuotas: 
  maxArrayLength="2000000" 
  maxStringContentLength="2000000"/>

(也改变了找到的值)但似乎不起作用。 我认为问题是消息超过每个“消息”的最大字节数,但我不明白为什么数据不跨越不同的消息。
感谢任何提示。

乔治

6 个答案:

答案 0 :(得分:1)

我有同样的问题,在我的情况下只是序列化一个字符串而没有问题,但在你的情况下,你正在序列化一大堆对象,有一个默认的限制,我记得我看到一个关于那个帖子(只是配置中的一个设置 - &gt; maxItemsInObjectGraph)来增加序列化对象的数量,

<强>链接

http://silverlight.net/forums/t/17674.aspx http://forums.asp.net/t/1330713.aspx

设置:

                                           

HTH   布劳略

答案 1 :(得分:0)

尝试在服务器端启用wcf服务日志记录。这可能会有所帮助:http://msdn.microsoft.com/en-us/library/ms730064.aspx

答案 2 :(得分:0)

我在InitializeComponent之后立即使用这两个语句:

binding.MaxReceivedMessageSize = 5000000 binding.MaxBufferSize = 5000000

您可以将数字更改为您想要的数字,但我必须这样做以便在Silverlgiht客户端上接收大量数据。我的绑定对象定义为:

私有绑定As New BasicHttpBinding

这是在vb.net中。在我加入这些物品后,它就像一个魅力。

答案 3 :(得分:0)

答案 4 :(得分:0)

我使用silverlight 4和vs 2010,我遇到了同样的问题,我解决了修改web.config文件的问题。

我原来的web.config文件有:

<system.serviceModel>
   <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>

我改变了:

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <behaviors> 
         <serviceBehaviors> 
             <behavior> 
                 <serviceMetadata httpGetEnabled="true"/> 
                 <serviceDebug includeExceptionDetailInFaults="true"/> 
                 <dataContractSerializer maxItemsInObjectGraph="2147483647"/>  <!--this very is important: it is the size of the buffer-->
             </behavior> 
         </serviceBehaviors> 
     </behaviors>
  </system.serviceModel>

答案 5 :(得分:0)

我可以建议您减少返回的记录数量吗?不是作为一种解决方案而是作为可用性建议。我无法想象任何用户正在显示3000多条记录。如果你要聚合数据集中的值而不是聚合它们服务器端,它将极大地提高你的应用程序的性能......我在我的应用程序中遇到过这种情况,并且几乎总是能够更好地解决这个问题。改变设计而不是选项......