我在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上重现此错误,但我怀疑设置这种错误处理程序会以任何方式改变
答案 0 :(得分:3)
我们遇到了同样的问题。我能够向MS提交一个修复程序,然后他们又发布了一个修复此问题的夜间版本。他们正在考虑将修复程序移植到RTM。你可以在这里看到拉动版本:http://aspnetwebstack.codeplex.com/SourceControl/network/forks/rdean79/issue284/contribution/3329