4

请注意,这个问题是我尚未解决的当前问题的一个分支:

当 WCF 服务返回 DataTable: OutOfMemoryException 时需要帮助解决错误

我有一个现有的 WCF 服务,其端点配置为TransferMode.Buffered和一个客户端应用程序,其连接要求相同。

OperationContracts除了非常小的方式外,我无法轻易修改这些已建立的方法。例如,我们有一个接受 SQL 查询String并返回DataTable从 SQL 执行派生的方法。

我们在使用这种方法时遇到了非常大的表的问题。大意味着内存占用。

我正在考虑实施TransferMode.Streamed(或类似的),但我似乎无法掌握如何仅针对某些方法执行此操作。

我的 WCF 服务启动,创建了唯一的端点,该端点是Buffered. 所以这使我们想要假设它是全部或全部。如果我改成那样,我将不得不对我所有的方法Streaming进行大规模的返工。OperationContract

有一些 SO 问题与这个主题有关,但不是直接的,也没有任何真正让我到达我需要去的地方的答案。

我错过了什么,还是可以使它起作用?

我需要修复的方法:(如果您想了解连接,请参考引用的问题...代码很多)

WCF 服务代码:

[OperationContract]
DataTable readDataTable(out DbError dbError, String queryString, Boolean SchemaOnly);

public DataTable readDataTable(out DbError dbError, String queryString, Boolean SchemaOnly)
{
    DataTable dt = new DataTable("ReturnTable");
    dbError = new DbError();
    if (!String.IsNullOrEmpty(queryString))
    {
        try
        {
            command.CommandText = queryString.Replace(new String[] { "{{", "}}", ";;" }, new String[] { "{", "}", ";" });
            SqlDataReader reader = command.ExecuteReader(SchemaOnly ? CommandBehavior.SchemaOnly : CommandBehavior.Default);
            dt.Load(reader);
            reader.Close();
        }
        catch (Exception ex)
        {
            dbError.HasError = true;
            dbError.Error = ex.Message + "\n\n" + queryString;
        }
    }
    return dt;
}

使用它的客户端代码:

public DataTable readDataTable(String queryString, Boolean SchemaOnly)
{
    DbError dbError;
    DataTable dt = svcCon.readDataTable(out dbError, queryString, SchemaOnly);
    if (dbError.HasError)
    {
        if (_showErrors)
        ErrorHandler.Show(dbError.Error);
    }
    return dt;
}
4

1 回答 1

2

这是一个很大的问题。我明白这个问题。简短的回答是,您不能在同一个端点操作合约中同时拥有流式传输和缓冲。当然,您可以从同一个 Web 服务运行 1 多个单独的端点,每个端点都有不同的端口,例如,一些使用缓冲,一些使用流式传输。

而且,您可以将主机设置为流式传输其响应,而客户端(使用相同的端点)可以将其上传请求缓冲到主机(反之亦然);这不是问题。但是无法缓冲和流式传输来自同一主机端点的响应。

我们在从 SQL 缓冲下载到客户端时遇到了同样的问题。有一段时间,我们使用流媒体进行下载,主要是为了解决客户端设备超时问题,但发现流媒体也是内存密集型的。我们发现,流媒体作为一种技术也更难使用。所以我们已经从流式传输回到缓冲,但是我们使用交互式“分块”方法来下载 > 100mb。例如,当需要交付 1 GB 的包时,主机将以 100mb 的块发送文件,客户端软件将其组装为单个文件。

我希望这可以帮到你。

于 2013-08-13T11:42:26.353 回答