gpt4 book ai didi

c# - WCF 服务能否同时支持缓冲和流式传输模式?

转载 作者:行者123 更新时间:2023-11-30 12:29:37 27 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

希望对您有所帮助。

关于c# - WCF 服务能否同时支持缓冲和流式传输模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18189993/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com