WCF-流式传输时的错误处理

时间:2009-05-10 06:39:24

标签: wcf error-handling streaming

为了支持流式传输,我将覆盖的消息返回给OnWriteBody ...
问题是如果在OnWriteBody中抛出异常(数据库超时或其中任何一个) IErrorHandler中的ProvideFault未被调用,因此我无法将错误传播到客户端(通过IErrorHandler中的过滤)。
有没有办法解决这个问题。

感谢。

2 个答案:

答案 0 :(得分:0)

在使用WCF进行流式处理时,我创建了两个ServiceContracts,其中一个执行流式传输,将在流式传输结束时发送通知。

响应ServiceContract我使用双工类型绑定。客户端首先调用响应ServiceContract以获取其事务的票证,然后调用我的传输ServiceContract。然后在事务结束时,客户端将收到响应ServiceContract的成功或失败通知。



[ServiceContract]
public interface IStreamFileService
{
  [OperationContract]
  void Upload(Stream stream);
}

[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(ITransferCallback))]
public interface IStreamFileResponseService
{
  [OperationContract(IsOneWay = false, IsInitiating = true, IsTerminating = false)]
  Guid StartUpload();
}

[ServiceContract]
public interface ITransferCallback
{
  [OperationContract]
  void OperationComplete(ResponseMessage response);
}

我在两个服务中执行此操作,因为我的要求和工作流程要求我跟踪许多事情并进行身份验证,验证等。

答案 1 :(得分:0)

当响应标头(如200)已发送到客户端时,将调用OnWriteBody。在这个阶段不可能处理错误。 我使用过两种解决方法/技巧:

  1. 在发送200之前等待第一个数据行(如返回Message之前)并在OnWriteBody内迭代更多行。这将起作用,因为大多数SQL错误和超时都会在显示任何数据之前发生。但是,如果在结果集迭代时出现错误,则不会覆盖案例。
  2. 在客户端和服务器上有特殊的错误处理代码。就像,如果出现错误,服务器内部OnWriteBody可能会序列化错误并将其作为特殊的数据行发送。客户应该在接收响应和处理时期望这样的特殊数据行。