WCF异处理
来源:互联网 发布:手机怎样开淘宝店铺 编辑:程序博客网 时间:2024/05/16 13:45
1.服务器端:
[AttributeUsage(AttributeTargets.Class)]
public class ErrorHandlerBehavior : Attribute, IServiceBehavior, IErrorHandler
{
protected Type ServiceType
{
get;
set;
}
void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
ServiceType = serviceDescription.ServiceType;
foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
{
// 增加错误处理器
dispatcher.ErrorHandlers.Add(this);
}
}
/// <summary>
/// 检查服务描述和服务宿主,以确认服务可以成功运行
/// </summary>
/// <param name="serviceDescription">服务描述</param>
/// <param name="serviceHostBase">服务宿主</param>
void IServiceBehavior.Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
/// <summary>
/// 为契约增加自定义绑定参数
/// </summary>
/// <param name="serviceDescription">服务描述</param>
/// <param name="serviceHostBase">服务宿主</param>
/// <param name="endpoints">服务端点</param>
/// <param name="bindingParameters">需要增加的自定义绑定参数</param>
void IServiceBehavior.AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
}
/// <summary>
/// 在异常返回给客户端之后被调用
/// </summary>
/// <param name="error">异常</param>
/// <returns></returns>
bool IErrorHandler.HandleError(Exception error)
{
//记录日志的异常信息
var sb = new StringBuilder();
sb.Append("IErrorHandler - HandleError错误:").AppendLine(error.ToString());
var wcffault = error as FaultException<WcfFaultInfo>;
if (!ReferenceEquals(wcffault,null))
{
sb.AppendLine(wcffault.Detail.ToString());
}
sb.AppendLine(Environment.NewLine);
LogFunc.AddLog(sb.ToString());
// true - 已处理
return true;
}
/// <summary>
/// 在异常发生后,异常信息返回前被调用
/// </summary>
/// <param name="error">异常</param>
/// <param name="version">SOAP版本</param>
/// <param name="fault">返回给客户端的错误信息</param>
void IErrorHandler.ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
var fe = new FaultException<WcfFaultInfo>(new WcfFaultInfo(error));
MessageFault mf = fe.CreateMessageFault();
fault = Message.CreateMessage(version, mf, fe.Action);
}
}
2.客户端:
/// <summary>
///
/// </summary>
internal static class ErrorHelper
{
/// <summary>
/// 服务器端返回客户端的错误处理
/// </summary>
/// <param name="fault"></param>
/// <returns></returns>
internal static FaultException<WcfFaultInfo> ExceptionHandle(this FaultException<WcfFaultInfo> fault)
{
var sb=new StringBuilder();
sb.AppendLine("WcfFaultInfo--");
sb.AppendLine(fault.ToString());
sb.AppendLine(fault.Detail.Message);
sb.AppendLine(fault.Detail.InnerMsg);
LogFunc.AddLog(sb.ToString());
return fault;
}
/// <summary>
/// 服务器端返回客户端的错误处理
/// </summary>
/// <param name="fault"></param>
/// <returns></returns>
internal static FaultException ExceptionHandle(this FaultException fault)
{
var wcfFault= fault as FaultException<WcfFaultInfo>;
if(wcfFault!=null)
{
var sb = new StringBuilder();
sb.AppendLine("WcfFaultInfo--");
sb.AppendLine(fault.ToString());
sb.AppendLine(wcfFault.Detail.Message);
sb.AppendLine(wcfFault.Detail.InnerMsg);
LogFunc.AddLog(sb.ToString());
}
else
{
LogFunc.AddLog(fault.ToString());
}
return fault;
}
}
---通道
/// <summary>
///
/// </summary>
/// <param name="func"></param>
/// <returns></returns>
private TResult SyncFunc<TResult>(Func<TResult> func)
{
TResult vResult=default(TResult);
try
{
vResult=func();
}
catch (TimeoutException ex)
{
Abort();
LogFunc.AddLog(ex, "TimeoutException--");
}
catch (FaultException<WcfFaultInfo> ex)
{
Abort();
ex.ExceptionHandle();
}
catch (FaultException ex)
{
Abort();
ex.ExceptionHandle();
}
catch (CommunicationException ex)
{
Abort();
LogFunc.AddLog(ex, "CommunicationException--");
}
return vResult;
}
参考:http://msdn.microsoft.com/zh-cn/library/gg281715.aspx
- WCF异处理
- WCF异常处理
- WCF - 异常处理
- WCF中的异常处理
- silverlight wcf 异常处理
- WCF HTTP异常处理
- WCF 异常处理
- Silverlight处理WCF异常
- WCF处理异常
- wcf错误处理
- 处理发布wcf问题
- WCF大数据量处理
- WCF 错误处理
- WCF异常与错误处理
- 开启WCF异常处理模式
- WCF中的Streaming流处理
- WCF的自定义异常处理
- WCF调用超时,错误处理
- 远程调用 HttpInvoker JSP工程其间的数据交互
- 在MAC系统的eclipse里打开android sdk manager
- MYSQL 主从同步日志暴涨
- man -k <word> : nothing appropriate
- PHP5.4 for Apache ; php 5.4.0安装过程、方法、配置 ; Apache2.2支持php5.4的配置方法
- WCF异处理
- redis线上环境监控脚本(python脚本)
- 整理SQL
- 代理模式——动态代理和模板方法那点事
- windows消息控制窗口最大化最小化
- 如何使网页瞬间变成灰色
- LINUX 下非阻塞模式下TCP 研究
- 2013年4月24日
- ANSI、UNICODE、UTF-8、GB2312、GBK、DBCS、UCS的区别和由来。