2011-03-17 32 views
6

Bazı saklı yordamları yürüten ve sonuçları gümüş ışığı istemcisine döndüren bir WCF hizmetimiz var. Kayıtlı prosedürlerden bazıları 80K satırına kadar döner.WCF hizmetinde arabellek boyutu

Hizmet

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="MyService.MyServiceBehavior"> 
       <serviceMetadata httpGetEnabled="true"/> 
       <serviceDebug includeExceptionDetailInFaults="true"/> 
       <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="BasicHttpBinding_MyService" 
       maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" 
       receiveTimeout="00:40:00" openTimeout="00:40:00" 
       closeTimeout="00:40:00" sendTimeout="00:40:00"> 
       <readerQuotas maxDepth="2147483647" 
        maxStringContentLength="2147483647" maxArrayLength="2147483647" 
        maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/> 
       <security mode="None"/> 
      </binding> 
     </basicHttpBinding> 
     <customBinding> 
      <binding name="MyService.MyService.customBinding0"> 
       <binaryMessageEncoding/> 
       <httpTransport/> 
      </binding> 
     </customBinding> 
    </bindings> 
    <services> 
      <service behaviorConfiguration="MyService.MyServiceBehavior" 
        name="MyService.MyService"> 
       <endpoint name="BasicHttpBinding_MyService" 
        address="" 
        binding="basicHttpBinding" 
        bindingConfiguration="BasicHttpBinding_MyService" 
        contract="MyService.IMyService"/> 
      </service> 
    </services> 
</system.serviceModel> 

için aşağıdaki web.config'de ayarları vardır Verilen Ve bu Client

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="MyService_Behavior"> 
       <serviceDebug includeExceptionDetailInFaults="true"/> 
       <serviceMetadata httpGetEnabled="true"/> 
      </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
      <behavior name="r1"> 
       <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
      </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="BasicHttpBinding_MyService" 
       closeTimeout="00:03:00" openTimeout="00:03:00" 
       receiveTimeout="00:10:00" sendTimeout="00:03:00" 
       allowCookies="false" bypassProxyOnLocal="false" 
       hostNameComparisonMode="StrongWildcard" 
       maxBufferSize="2147483647" maxBufferPoolSize="2147483647" 
       maxReceivedMessageSize="2147483647" 
       messageEncoding="Text" textEncoding="utf-8" 
       transferMode="Buffered" useDefaultWebProxy="true"> 
       <security mode="None"/> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint name="BasicHttpBinding_MyService" 
      address="http://localhost:8080/MyService/MyService.svc" 
      behaviorConfiguration="r1" 
      binding="basicHttpBinding" 
      bindingConfiguration="BasicHttpBinding_MyService" 
      contract="MyService.IMyService" /> 
    </client> 
</system.serviceModel> 

kayıtların sayısı 20K ötesine zaman için, hizmet TimeOut ya gibi bir hata atar veya NotFound. Neden böyle olduğunu düşünüyorsun n nasıl düzeltebilirim?

+1

Eğer bir çağrısından 80K satırları dönmek istediğinden emin misin:

Biz bunu başarmak için MS kütüphaneleri kullanılmıştır? Belki de "disk belleği" sonuçları yeniden düzenlemek ve kullanmak daha uygun olur mu? – Jon

+0

Kulağa saçma geldiğini biliyorum, ancak kullanıcılar ağda göründüğü için cehennemde bükülüyorlar (tabii ki, pagination ile gösterdik). Telerik gibi çoğu üçüncü şahıs ızgaraları, – Kev

+0

'u destekliyor. Bu verileri multipe çağrılarda almayı deniyorsunuz DownloadPage (1) ... n, tüm verileri alacaksınız ama daha küçük parçalarda – kalvis

cevap

3

Bu, aşırı veri yüklemesi gibi görünüyor. Yorumlarda belirtildiği gibi, sayfalandırma pratik bir çözümdür. 80k'yi istemek için iyi bir neden varsa, verileri serileştirmek için farklı bir mekanizma kullanmayı deneyebilirsiniz. Örneğin, protobuf verileri genellikle xml'den daha küçük olan kadardır, bu yüzden bunu kabloda kullanmayı deneyebilirsiniz. Ancak, bu Silverlight olduğundan otomatik olarak bunu değiştiremiyorum - bir byte[] veya Stream döndürmeniz ve serileştirme/serileştirmeyi açıkça sunucu/istemcide ele almanız gerekir. Bu, bant genişliği gereksinimlerini adil bir vuruşla azaltmalıdır (Silverlight'ı MTOM kullanacak şekilde yapılandırabiliyorsanız daha fazla kontrol etmeliyim - son zamanlarda kontrol etmedim, ancak bu bazı önceki sürümlerde desteklenmedi).

+0

Bu cevaba katılıyorum. İleriye doğru, sonuçları görüntülemenin en iyi yolu, kullanıcı bir sonraki sayfaya geçtikçe daha az miktarda veri almak olacaktır. Ama şu anda, bu sorun bir üretim sisteminde ortaya çıktığı için hızlı bir düzeltmeye ihtiyacım var. – Kev

+1

@Kraldır * şanslı olup, bunu yapmanın bir yolunu bulabilir, ancak her şey hızlı bir düzeltme ile ele alınamaz. Hızlı bir düzeltme yapmak için harcanan zamanı durdurmak için daha hızlı olabilir ve yalnızca temel sorunu çözebilir. –

2

Ürününüz 80K değerini döndürdüğünde, arabellek boyutunuzu da İstemci sonuna eklemeniz gerekir.

readerQuotas

<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/> 

Bu çalışması gerekir. Gerekirse, arabellek boyutunu artırın.

İlgili konular