我正在尝试在使用 iis 和 net.tcp 的 WCF 服务中实现 IErrorHandler。
我设置了一个在服务器中抛出 DivideByZeroException 的场景。IErrorHandler 正在按预期触发。
FaultException 没有返回给客户端,我收到超时异常。我在事件日志中也找不到任何信息/异常。
这是演示代码。 http://www.fileswap.com/dl/gQFlVsZK7M/(请点击慢速下载图片)
编辑 1(从存档中添加代码供所有人查看):
服务合约:
[ServiceContract]
public interface IService1
{
[OperationContract]
[FaultContract(typeof(DivideByZeroException))]
string GetData(int value);
[OperationContract]
[FaultContract(typeof(DivideByZeroException))]
CompositeType GetDataUsingDataContract(CompositeType composite);
// TODO: Add your service operations here
}
服务实施:
public class Service1 : IService1
{
public string GetData(int value)
{
int i = 0;
//division by zero!
int y = 10/i;
return string.Format("You entered: {0}", value);
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite == null)
{
throw new ArgumentNullException("composite");
}
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
}
IErrorHandler 实现:
public class WcfErrorHandler : IErrorHandler
{
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
var v = error as DivideByZeroException;
if (v != null)
fault = Message.CreateMessage(
version,
new FaultException<DivideByZeroException>(v, new FaultReason(v.Message)).CreateMessageFault(),
"http://the.fault.action");
}
public bool HandleError(Exception error)
{
return true;
}
}