c# - WCF:从多行返回单行

标签 c# asp.net .net wcf

我正在尝试从 WCF 服务获取数据并将其显示在网站中。
通信如下所示:
网站 --> WCF 服务 --> CRM 服务器 --> WCF 服务 --> 网站

现在我的问题是,有时需要获取更大的数据,大约 5k 行。 (我的主机电脑内存用完) 我想将 1-10 行流式传输到网站,然后是下一行,依此类推。

我的服务契约(Contract)如下所示:

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 类并返回结果。 (自动取款机禁用寻呼和 cooking 功能)。

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;
}

1. yield 返回使用是否正确?

绑定(bind)
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.绑定(bind)是否正确?

3.我的想法有问题吗? 请记住,我正在尝试从 5000 行中获取 1-10 行并将其显示在网站上,获取接下来的 1-10 行,依此类推。
只有数据,没有二进制数据或类似的东西。

4.只需要一个请求就可以吗?

最佳答案

首先,请记住,WCF 存在于面向服务的范式中,而不是面向对象的范式中。对 WCF 的许多误解在于它能够包装服务调用并以面向对象的方式呈现它。

您可以返回 IEnumerable<Row>您的服务就是一个例子。我们误以为我们正在对抽象进行编程,而实际上 WCF 必须通过网络序列化服务调用的结果(非常具体的实现),然后将其转换为客户端上的接口(interface).

因此,您无法对所需的序列执行“惰性”评估 - 是的 - 即使您只想要前 10 个结果,您也将通过网络拉取整个结果集。

WCF 确实支持流式传输 ( http://msdn.microsoft.com/en-us/library/ms733742.aspx ),但更简单的方法可能是向您的服务契约添加参数以指示您需要的页面信息:

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

此契约(Contract)更符合无状态面向服务的应用程序,尊重这样的观念:您不应该在系统中传递大量数据,而只使用您需要的数据。

请注意,我已替换 IEnumerable<Row>使用数组 - 消除您正在通过线路对接口(interface)进行编程的印象。

关于c# - WCF:从多行返回单行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18490430/

相关文章:

c# - 如何创建匹配的 HMAC 值来验证 .NET 中的 Shopify WebHook?

c# - 从对象列表中获取值列表

.net - 来自 UserControl 的 ASP.NET AJAX 页面方法

c# - 从 URL 获取整个字符串,包括非查询字符串 C#

asp.net - 我们将 SOAP 和 REST 端点用于我们的 WCF 服务。 ASP.NET Web API 对我们意味着什么?

.net - 在桌面应用程序中使用 System.Web 是否存在问题

c# - 如何为我的 UserControl 绑定(bind)不同的 DataContext?

c# - 通过常量而不是变量将 int 类型转换为 byte 会引发错误

c# - 使用 FileWatcher 检测文件夹中是否创建了新文件

.NET Directory.Move() 与 File.Move()