我在 Windows 服务中使用 web api自托管,我遇到了一个问题,在谷歌搜索了几个小时后还没有找到合理的答案。
其中一个 api 控制器提供大量数据流(不是那么大,几十 MB)。生成数据需要一些时间,所以我决定使用TransferMode.StreamedResponse来最小化客户端等待响应的时间。我还添加了一个CompressHandler
和自定义CompressedContent
(派生自HttpContent
),主要基于以下答案。
控制器返回一个 的实例IDataReader
,然后由自定义格式化程序对其进行序列化,该格式化程序最后在CompressedContent
我提到的内部压缩。整个数据传递都是流式传输的,因此当客户端接收数据时,服务器端的数据读取器可能仍在从数据库中读取行。当客户表现良好时,一切正常。
当客户端断开连接而数据仍在被序列化到底层网络流时,就会出现此问题。我试图观察委托IsFaulted
内部的任务(来自链接)并处理底层网络。不幸的是,当控件离开我的代码时,(指定的网络名称不再可用)仍然被抛出。从堆栈跟踪来看,当 Web Api 尝试关闭(结束)底层网络流(http 通道?)时,似乎引发了异常。当它发生未观察到的异常时,它会关闭整个 Windows 服务。ContinueWith
CompressedContent
Stream
CommunicationException
我通过设置 Windows 服务恢复选项缓解了这个问题,但我想知道这个故障是否可以在代码中处理。
有没有办法IErrorHandler
在 web api 自托管服务模式中设置自定义错误处理程序(大概)来防止这种错误?
我正在使用 Beta 版本,我将尝试在 RC 上重现此错误,但我怀疑设置这种错误处理程序会以任何方式改变