WCF服务可以同时支持缓冲传输模式和流传输模式吗

本文关键字:模式 传输 缓冲 支持 服务 WCF | 更新日期: 2023-09-27 18:27:25

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

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

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

OperationContracts是我无法轻易修改的既定方法,除非以非常小的方式。例如,我们有一个方法,它接受SQL查询String并返回从SQL执行派生的DataTable

使用此方法处理非常大的表时遇到问题。内存占用空间意义重大。

我正在考虑实现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;
}

WCF服务可以同时支持缓冲传输模式和流传输模式吗

这是一个大问题。我理解这个问题。简单的答案是,不能在同一个端点操作契约中同时拥有流和缓冲。当然,您可以从同一个web服务运行1个单独的端点,每个端点都有不同的端口,例如,有些端点使用缓冲,有些端点则使用流。

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

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

我希望这会有所帮助。