我正在尝试将附加信息附加到FaultException
WCF
服务,然后在客户端中访问它。我正在使用IErrorHandler
ProvideFault
方法,因为我的服务有很多公开的方法,我想在一个地方定义错误处理逻辑。
我已经定义了一个数据类CoreFault
:
[DataContract]
public class CoreFault
{
[DataMember]
public string Foo { get; set; }
}
并实施IErrorHandler
接口以返回强类型FaultException
:
public class ErrorHandler : IErrorHandler
{
public void ProvideFault(Exception error, MessageVersion version, ref Message message)
{
var faultException = new FaultException<CoreFault>(
new CoreFault
{
Foo = "Bar"
},
"An error occurred",
null);
var fault = faultException.CreateMessageFault();
message = Message.CreateMessage(
version,
fault,
faultException.Action);
}
}
我的服务是在代码中配置的:
public static void Configure(ServiceConfiguration config)
{
(config.Description.Behaviors[0] as ServiceBehaviorAttribute).IncludeExceptionDetailInFaults = true;
config.Description.Behaviors.Add(new ErrorHandlingBehaviour());
}
我在创建消息后打破了代码,它显示了以下XML:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header/>
<s:Body>
<s:Fault>
<faultcode>s:Client</faultcode>
<faultstring xml:lang="en-GB">An error occurred</faultstring>
<detail>
<CoreFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/EmployerPortal.Models.Faults">
<Foo>Bar</Foo>
</CoreFault>
</detail>
</s:Fault>
</s:Body>
</s:Envelope>
但是在我的客户端中,抛出的错误是FaultException
而不是FaultException<CoreFault>
,并且额外的信息会丢失。
try
{
// Call service here
...
}
catch (FaultException<CoreFault> e)
{
throw;
}
catch (FaultException e)
{
// This line is hit
throw;
}
如何将Foo
传递给客户端,以便在处理异常时可以访问它?