【发布时间】:2016-03-08 19:36:52
【问题描述】:
我正在运行一个小型 WCF 客户端应用程序,它每隔几分钟就连接到 IIS 服务器以下载数据。大约有 500 个这样的客户端用于 2 或 3 个服务器,我的基本代码是这样的:
Client connection = null;
try
{
connection = new Client();
List<TPointer> objects = connection.GetList();
// Some work on List<T>
foreach (TPointer pointer in objects)
{
T data = GetDataFromStream(pointer, connection);
// Some additional processing on T
}
connection.SendMoreData();
// More work
}
catch (...)
{
// Exception handling for various exceptions
}
finally
{
// Handle Close() or Abort()
if (connection != null)
connection.Close();
}
当我为大量 TPointer 模拟一次运行所有客户端时,我开始遇到以下错误:
System.TimeoutException:请求通道在 00:01:00 后等待回复时超时。
这似乎是可能由于多种原因而发生的错误之一。据我所知,服务器可能只是被淹没了,或者我可能请求了太大/太多的对象,并且下载时间太长(不过一分钟?)。增加超时是一种选择,但我想了解实际问题而不是修复症状。
鉴于我无法控制服务器,我该如何简化我的客户端?
我实际上并不确定超时中提到的“请求通道”指的是什么。超时是否从我创建 new Client() 到我调用
Client.Close()开始计时?或者我发送到服务器的每个特定请求(例如GetList或GetData)是否需要一分钟?在每次调用服务器之间关闭Client()值得我花时间吗? (我希望不会……那会很丑)对我接收的数据量进行分块会有帮助吗?
GetList()调用可能非常大(达到数千个)。我可以尝试一次获取几个对象并完成后期处理以供以后使用...
编辑:
由于少数人提到了流媒体:
Client 绑定使用TransferMode.StreamedResponse。
GetDataFromStream() 使用从 TPointer 派生的 Stream,SendMoreData() 的有效负载大小或多或少可以忽略不计。
只有GetList()实际上返回一个非流对象,但我不清楚这是否会影响传输方法。
【问题讨论】: