【问题标题】:How to throw an exception to the client over wcf callback如何通过 wcf 回调向客户端抛出异常
【发布时间】:2011-11-17 18:04:16
【问题描述】:

我有一个 wcf 服务,它有一个单向操作,它在回调中发送结果。这是我的服务定义

 [ServiceContract(CallbackContract = typeof(IIrmCallback), SessionMode = SessionMode.Required)]
    public interface IFileService
    {
       [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
       [ServiceKnownType(typeof(StatementFile))]
       [ServiceKnownType(typeof(InvoiceFile))]
       void UploadFile(IFile file);
    }

    public interface IFileCallback
    {
       [OperationContract]
       void FileProcessed(string result);
    }

public MyService : IFileService
{
  IFileCallBack callbackchannel;
  object result;
  public void UploadFile(IFile file)
{
   callbackChannel = OperationContext.Current.GetCallbackChannel<IIrmCallback>();
   Task.Factory.StartNew(() => ProcessFile(file));
}
private ProcessFile(IFile file)
{
// file gets processed
 callbackChannel.FileProcessed(result)
}
}

那么现在如果在文件处理过程中出现一些错误,我是否可以在回调中向调用者抛出异常?

【问题讨论】:

    标签: wcf exception-handling callback


    【解决方案1】:

    您可以使用FaultException

    当操作抛出异常时,会向客户端返回一个FaultException。

    【讨论】:

    • UploadFile 是单向操作,我修复了代码示例,因此抛出的错误异常不会到达客户端。
    • @Satish: s Michael 说,你必须在你的 void UploadFile(IFile file) 上添加一个 [FaultContract(typeof(YourCustomFault))];
    • 不能同时设置 FaultContract 属性和 OneWay =true 属性
    • 你说得对,我刚刚检查过。不能删除 OneWay 属性?
    【解决方案2】:

    您需要在服务接口中实现一个 FaultContract,指定该给定方法中可能出现的故障类型,然后在该方法中抛出一个继承自 FaultException 的新故障。

    在客户端,请确保分别捕获和处理 FaultException 和 Exception 对象,因为 Exceptions 会导致 WCF 通道发生故障并且无法重用,而 FaultException 将允许您继续使用现有通道。

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      相关资源
      最近更新 更多