是否可以使用TimeoutException在客户端上处理诸如BehaviorExtension、EndpointNotFoundException、OperationTimeoutException等错误?
我不想每次使用WCF代理时都尝试捕获日志重新启动连接。
此代码不起作用:
行为:
public class EndpointBehavior:IEndpointBehavior
{
public void Validate(ServiceEndpoint endpoint)
{
}
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
var handler = new WcfErrorHandler();
clientRuntime.CallbackDispatchRuntime.ChannelDispatcher.ErrorHandlers.Add(handler);
}
}处理程序:
public class WcfErrorHandler:IErrorHandler
{
public bool HandleError(Exception error)
{
Log.Instance.Trace(@"WCF Service Error:", error);
return true;
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
var newEx = new FaultException(
string.Format(@"Exception caught at WcfErrorHandler{0} Method: {1}{2}Message:{3}",
Environment.NewLine, error.TargetSite.Name, Environment.NewLine, error.Message));
var msgFault = newEx.CreateMessageFault();
fault = Message.CreateMessage(version, msgFault, newEx.Action);
}
}app.config的扩展
public class ExceptionLogBehaviorExtensionElement : BehaviorExtensionElement
{
public override Type BehaviorType
{
get
{
return typeof(EndpointBehavior);
}
}
protected override object CreateBehavior()
{
return new EndpointBehavior();
}
}发布于 2022-06-30 22:59:37
您的代码无法工作,因为IErrorHandler是一个服务器端的功能。
在您的代码中,您似乎要将错误处理程序添加到客户端请求中,但实际上并非如此。这是因为clientRuntime.CallbackDispatchRuntime是一个类似服务器的实体,它驻留在客户机中,用于从双工操作中的真正服务器接收消息。
关于客户端异常处理的主要问题,我推荐的最好是IClientMessageInspector。以下是一些帮助您入门的代码:
public sealed class LoggingEndpointBehavior : IEndpointBehavior
{
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { }
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.ClientMessageInspectors.Add(new LoggingInspector());
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) { }
public void Validate(ServiceEndpoint endpoint) { }
}
public sealed class LoggingInspector : IClientMessageInspector
{
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
Console.WriteLine("BeforeSendRequest");
return null;
}
public void AfterReceiveReply(ref Message reply, object correlationState)
{
Console.WriteLine("AfterReceiveReply");
}
}但是,请注意,IClientMessageInspector有一个缺点。它的AfterReceiveReply方法是对服务器的成功和错误的答复调用的,但是当根本没有任何应答时,就不会被称为,例如TimeoutException、EndpointNotFoundException等等。
https://stackoverflow.com/questions/26253479
复制相似问题