我有一个WCF服务,如果出了问题,会抛出一个通用的FaultException。我不知道为什么,有时客户端会捕获非泛型FaultException而不是泛型异常。
有人知道问题出在哪里吗?
发布于 2009-03-15 16:45:36
您的服务需要处理所有异常,并将它们包装到FaultException中,其中T是您编写的数据契约。因此,第一步是定义一个包含异常信息的自定义数据契约:
[DataContract]
public class CustomFault
{
public string Message { get; set; }
}然后告诉您的服务契约,它的方法可能抛出FaultException。这允许服务在wsdl中公开CustomFault类,以便客户端可以生成代理类:
[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,只要某个服务方法抛出异常,就会使用它。此错误处理程序的目的是将异常包装到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>(customFault);
MessageFault fault = fe.CreateMessageFault();
string ns = "http://somenamespace/whatever";
msg = Message.CreateMessage(version, fault, ns);
}
}一旦您注册了错误处理程序,在客户端,您将始终获得FaultException。
发布于 2011-01-08 02:31:12
如果您的客户端不能访问异常类型本身( FaultException< T>上的< T>),那么就会抛出FaultException的非泛型版本。我花了几个小时试图弄清楚这一点,当我在msdn论坛上发现this时,我终于意识到了这一点。如果在将异常抛出服务之前有一些迹象表明异常已经更改,那就太好了,但事实并非如此。
发布于 2009-03-15 17:12:30
当服务抛出一些其他未捕获的异常时,将引发非泛型FaultException。您需要找出异常是什么,如果它是一个bug,则修复它,或者确定它是您想要向您的客户端公开的东西,然后将其包装在通用FaultException中并适当地添加FaultContract。
https://stackoverflow.com/questions/648084
复制相似问题