WCF服务是否支持缓冲和流传输模式?

时间:2013-08-12 14:44:04

标签: c# wcf .net-3.5

请注意,这个问题是我尚未解决的当前问题的背景:

Need help resolving an error when WCF service returns 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;
}

1 个答案:

答案 0 :(得分:2)

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

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

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

我希望这很有帮助。