客户端断开连接时,Asp.net Web API自主服务未处理异常

时间:2012-06-11 19:17:55

标签: asp.net wcf asp.net-web-api wcf-web-api

我在Windows服务中使用web api 自我主机,我遇到了一个问题,谷歌搜索几个小时后没有找到合理的答案。

其中一个api控制器提供大量数据流(实际上不是那么大,几十MB)。生成数据需要一些时间,所以我决定使用 TransferMode.StreamedResponse 来最小化客户端等待响应的时间。我还添加了CompressHandler和自定义CompressedContent(源自HttpContent),主要基于以下answer

控制器返回IDataReader的实例,然后由自定义格式化程序序列化,最后在我提到的CompressedContent内压缩。整个数据传递流式传输,因此当客户端接收数据时,服务器端的数据读取器可能仍在从数据库中读取行。当客户表现得很好时,一切都很好。

当数据仍然序列化到底层网络流时,客户端断开连接时会出现此问题。我已尝试在IsFaulted委托内部(ContinueWith中的CompressedContent内查看Stream任务,并部署基础网络CommunicationException。不幸的是,当控件离开我的代码时,仍然会抛出IErrorHandler(指定的网络名称不再可用)。从堆栈跟踪看,当Web Api尝试关闭(结束)底层网络流(http通道?)时,会抛出异常。正如在未观察到的异常中发生的那样,它会使整个Windows服务失效。

我通过设置Windows服务恢复选项缓解了这个问题,但我想知道是否可以在代码中处理此故障。

有没有办法在web api自托管服务模式中设置自定义错误处理程序({{1}})以防止出现此类错误?

我正在使用Beta版本,我会尝试在RC上重现此错误,但我怀疑设置这种错误处理程序会以任何方式改变

1 个答案:

答案 0 :(得分:3)

我们遇到了同样的问题。我能够向MS提交一个修复程序,然后他们又发布了一个修复此问题的夜间版本。他们正在考虑将修复程序移植到RTM。你可以在这里看到拉动版本:http://aspnetwebstack.codeplex.com/SourceControl/network/forks/rdean79/issue284/contribution/3329