3

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

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

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

当客户端断开连接而数据仍在被序列化到底层网络流时,就会出现此问题。我试图观察委托IsFaulted内部的任务(来自链接)并处理底层网络。不幸的是,当控件离开我的代码时,(指定的网络名称不再可用)仍然被抛出。从堆栈跟踪来看,当 Web Api 尝试关闭(结束)底层网络流(http 通道?)时,似乎引发了异常。当它发生未观察到的异常时,它会关闭整个 Windows 服务。ContinueWithCompressedContentStreamCommunicationException

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

有没有办法IErrorHandler在 web api 自托管服务模式中设置自定义错误处理程序(大概)来防止这种错误?

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

4

1 回答 1

3

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

于 2012-10-03T13:40:27.973 回答