我有一个WCF服务,如果出现问题,会抛出一个通用的FaultException.我不知道为什么,有时客户端会捕获非泛型的FaultException而不是泛型异常.
有谁知道,问题是什么?
您的服务需要处理所有异常并将它们包装到FaultException
[DataContract] public class CustomFault { public string Message { get; set; } }
然后,您指示您的服务合同,其方法可能会抛出FaultException
[ServiceContract] public interface IMyServiceContract { [FaultContract(typeof(CustomFault))] void MyMethod(string someArgument); }
下一步是实现此接口:
public class MyService : IMyServiceContract { public void MyMethod(string someArgument) { // Do something here that could throw exceptions but don't catch yet } }
要处理异常,您可以实现IErrorHandler,只要您的某个服务方法抛出异常,就会使用IErrorHandler.此错误处理程序的目的是将异常包装到FaultException
public class MyErrorHandler : IErrorHandler { public bool HandleError(Exception error) { return true; } public void ProvideFault(Exception error, MessageVersion version, ref Message msg) { var customFault = new CustomFault() { Message = error.Message, }; var fe = new FaultException(customFault); MessageFault fault = fe.CreateMessageFault(); string ns = "http://somenamespace/whatever"; msg = Message.CreateMessage(version, fault, ns); } }
一旦注册了错误处理程序,在客户端,您将始终获得FaultException
如果您的客户端无法访问Exception类型本身(FaultException