2013-08-28 43 views
2

我想從WCF服務獲取數據並將其顯示在網站中。
通信看起來是這樣的:
網站 - > WCF服務 - > CRM服務器 - > WCF服務 - >網站現在WCF:從多行返回單行

我的問題是,有時還會有更大的數據得到的,5K左右的行。 (和我的主機電腦用完拉姆) 我想流1-10行到網站,然後下一步等。

我的ServiceContract看起來是這樣的:

public interface ICommunicationService 
{  
    [OperationContract] 
    IEnumerable<Row> GetCrmData(string view); 

} 

,我的實:

public IEnumerable<Row> GetCrmData(string view) 
{ 
    var data = new DataFromCrm(view); 
    return data.GetRows(MetaInformation); 
} 

GetRows方法看起來就像這樣:http://msdn.microsoft.com/en-us/library/gg327917.aspx 除了在foreach我填充Row類和產量返回結果。 (傳呼和烹飪禁用atm)。

foreach (var c in returnCollection.Entities) 
{ 
    var row = new Row(); 
    row.RecordId = c.Attributes[ID].ToString(); 
    foreach (var info in metaInfo) 
    { 
     row.Cells.Add(c.Attributes[info.AttributeName]); 
    } 
    yield return row; 
} 

是否使用了產量的回報嗎?

綁定
WCF服務:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="ServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

<services> 
    <service behaviorConfiguration="ServiceBehavior" 
      name="ComToCrmService.CommunicationService"> 
    <endpoint binding="basicHttpBinding" 
       bindingNamespace="http://localhost:9006/CommunicationService.svc" 
       contract="ComToCrmContracts.ICommunicationService" /> 
    </service> 
</services> 

WCF客戶

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="BasicHttpBinding_ICommunicationService" 
       closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" 
       bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
       maxBufferSize="65536" 
       maxReceivedMessageSize="4294967294" 
       messageEncoding="Text" 
       textEncoding="utf-8" 
       transferMode="Streamed" 
       useDefaultWebProxy="true"> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint binding="basicHttpBinding" 
       bindingConfiguration="BasicHttpBinding_ICommunicationService" 
       contract="ComToCrmReference.ICommunicationService" 
       name="BasicHttpBinding_ICommunicationService" 
       address="http://dev11.meta10.com:9007/WCFTestService/CommunicationService.svc" /> 
    </client> 
    </system.serviceModel> 

2.是綁定是否正確?

3.我的思維有沒有失敗? 記得我試圖讓5000行中的1-10行顯示在網站上,獲取下一個1-10行等等。
只有數據沒有二進制數據或類似的東西。

4.它甚至可能只有一個請求?

回答

6

首先,請記住,WCF生活在服務導向的範式 - 不是面向對象。許多關於WCF的錯誤理解在於它能夠結束服務調用並以面向對象的方式呈現它。

事實上,您可以從服務中返回IEnumerable<Row>就是一個例子。我們被愚弄到認爲我們正在編程爲一種抽象,事實上WCF必須通過線路序列化服務調用的結果(非常具體的實現),然後將其轉換爲客戶端上的接口。因此,你不能對你所需要的序列進行「懶惰」的評估 - 是的 - 即使你只想要第一個10,你也會把整個結果集放在電線上。

WCF不支持流媒體(http://msdn.microsoft.com/en-us/library/ms733742.aspx),但一個簡單的方法可能是參數添加到您的服務合同,以表明您需要的頁面信息:

public interface ICommunicationService 
{ 
    [OperationContract] 
    Row[] GetCrmData(string view, int pageNumber, int pageSize); 
} 

該合同是遠遠更符合無狀態的服務保持這個概念尊重你不應該在系統周圍傳遞大量數據的想法,而只能使用你需要的東西。

請注意,我已將IEnumerable<Row>替換爲數組 - 將您編程的印象移除到接口上。

+0

如果我是正確的,你的建議只加載10行(如果我只顯示10行),然後加載網站時加載更多頁面? – domiSchenk

+0

最簡單的形式是,儘管你可以很聰明地加載前5個頁面,或者根據應用程序的使用模式量身定製一些其他緩存算法。 – Lawrence