2011-11-17 116 views
1

我有一个wcf服务,它具有单向操作并将结果发送回调。这里是我的服务定义如何通过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) 
} 
} 

所以,现在如果在文件处理过程中的一些错误是有什么方法,我可以抛出一个异常给回调来电?

回答

3

您可以使用FaultException

当操作抛出一个异常,一个FaultException异常将被返回给客户端。

+0

UploadFile是单向操作,我修复了代码示例,因此引发的故障异常不会到达客户端。 – Satish

+0

@Satish:s Michael说,你必须在你的void UploadFile(IFile文件)上添加一个[FaultContract(typeof(YourCustomFault))]; –

+1

您无法将FaultContract属性和OneWay = true属性一起设置为 – Satish

1

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

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

相关问题