zoukankan      html  css  js  c++  java
  • WCF 常见逻辑和代码 1.错误处理和配置

    这些东西都很多人写过了.....

    放在这里只是做一个备份,要用的时候找的到 - -#

    需要的人直接拷贝代码就可以运行了

    注意只能运行在WCF 4.0中...因为为了少些点.....

    以下是c#代码用于定义错误处理

    View Code
        public class ErrorHandler : IErrorHandler
    {
    #if DEBUG
    public static ConcurrentDictionary<DateTime, Exception> ExceptionList = new ConcurrentDictionary<DateTime, Exception>();
    #endif

    private static WebBodyFormatMessageProperty bodyFormat = new WebBodyFormatMessageProperty(WebContentFormat.Xml);
    private static HttpResponseMessageProperty responseMessage = new HttpResponseMessageProperty() { StatusCode = System.Net.HttpStatusCode.InternalServerError };
    public bool HandleError(Exception error)
    {
    return true;
    }

    public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
    {
    #if DEBUG
    ExceptionList[DateTime.Now] = error;//just debug, don't care time conflict
    #endif
    Logger.Current.WriteEntry(error);

    var exception = error as OperationException;//custom exception type
    if (exception != null)
    {
    //要修改返回内容注意这里
    fault = Message.CreateMessage(version, "", new OperationResult(Convert.ToInt32(exception.ErrorCode), exception.ToString()), new DataContractJsonSerializer(typeof(OperationResult)));
    }
    else
    {
    fault = Message.CreateMessage(version, "", new OperationResult(-1, error.ToString()), new DataContractJsonSerializer(typeof(OperationResult)));
    }
    //要修改返回类型注意这里
    fault.Properties.Add(WebBodyFormatMessageProperty.Name, bodyFormat);//use xml format
    fault.Properties.Add(HttpResponseMessageProperty.Name, responseMessage);//error code
    }
    }

    public class ErrorHandlerExtension : BehaviorExtensionElement, IServiceBehavior
    {
    public override Type BehaviorType
    {
    get { return GetType(); }
    }

    protected override object CreateBehavior()
    {
    return this;
    }

    private IErrorHandler GetInstance()
    {
    return new ErrorHandler();
    }

    void IServiceBehavior.AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    {
    }

    void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
    IErrorHandler errorHandlerInstance = GetInstance();
    foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
    {
    dispatcher.ErrorHandlers.Add(errorHandlerInstance);
    }
    }

    void IServiceBehavior.Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {

    }
    }

    /// <summary>
    /// just wrap errorcode and errormessage
    /// </summary>
    public class OperationException : System.ApplicationException
    {
    public ErrorCode ErrorCode { get; set; }
    public OperationException(ErrorCode errorCode)
    {
    this.ErrorCode = errorCode;
    }
    public OperationException(ErrorCode errorCode, string message)
    : base(message)
    {
    this.ErrorCode = errorCode;
    }
    }

    以下是在web.config中的配置

        <extensions>
    <behaviorExtensions>
    <add name="errorHandler" type="{命名空间}.ValidationBehaviorSection, {dll名字}"/>
    </behaviorExtensions>
    </extensions>
    <behaviors>
    <serviceBehaviors>
    <behavior>
    <errorHandler/>
    </behavior>
    </serviceBehaviors>
    </behaviors>

    要注意的方法就是ProvideFault 用于处理异常 (在没有执行完这个方法前不返回)

    HandleError方法不阻止消息返回..用来写日志会好点

  • 相关阅读:
    PS 色调——颜色运算
    [ExtJS5学习笔记]第二十二节 Extjs5中使用beforeLabelTpl配置给标签增加必填选项星号标志
    [ExtJS5学习笔记]第二十一节 Extjs5中使用config配置给ext.widget或者create方法传递参数
    PS 滤镜——素描算法(一)
    [ExtJS5学习笔记]第二十节 Extjs5配合数组的push方法,动态创建并加载组件
    [ExtJS5学习笔记]第十九节 Extjs5中通过设置form.Panel的FieldSet集合属性控制多个field集合
    【翻译】Ext JS最新技巧——2014-9-10
    Ext JS 5的声明式事件监听
    BZOJ_3477_[Usaco2014 Mar]Sabotage_二分答案
    BZOJ_3012_[Usaco2012 Dec]First!_trie树+拓扑排序
  • 原文地址:https://www.cnblogs.com/PurpleTide/p/2200402.html
Copyright © 2011-2022 走看看