我有一个WCF服务,如果出现问题,会抛出一个通用的FaultException.我不知道为什么,有时客户端会捕获非泛型的FaultException而不是泛型异常.
有谁知道,问题是什么?
Dar*_*rov 18
您的服务需要处理所有异常并将它们包装到FaultException <T>中,其中T是您编写的数据协定.因此,第一步是定义一个包含您的异常信息的自定义数据协定:
[DataContract]
public class CustomFault
{
public string Message { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后,您指示您的服务合同,其方法可能会抛出FaultException <CustomFault>.这允许服务在wsdl中公开CustomFault类,以便客户端可以生成代理类:
[ServiceContract]
public interface IMyServiceContract
{
[FaultContract(typeof(CustomFault))]
void MyMethod(string someArgument);
}
Run Code Online (Sandbox Code Playgroud)
下一步是实现此接口:
public class MyService : IMyServiceContract
{
public void MyMethod(string someArgument)
{
// Do something here that could throw exceptions but don't catch yet
}
}
Run Code Online (Sandbox Code Playgroud)
要处理异常,您可以实现IErrorHandler,只要您的某个服务方法抛出异常,就会使用IErrorHandler.此错误处理程序的目的是将异常包装到FaultException <CustomFault>中:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
一旦注册了错误处理程序,在客户端,您将始终获得FaultException <CustomFault>.
| 归档时间: |
|
| 查看次数: |
13681 次 |
| 最近记录: |