WCF實現將服務器端的錯誤信息返回到客戶端

WCF實現將服務器端的錯誤信息返回到客戶端

2011-12-21 11:37 by Ref Tian, 398 visits, 收藏, 編輯

最近在園子裏轉看到有人對如題的實現有疑問,今天有時間就寫了項目把實現簡單的講解一下,如果你是牛逼人物那就繞道吧,哥不想浪費你的時間,現在開始:

默認WCF是不允許將服務器的異常信息返回到客戶端的(主要是客戶端不一定能夠識別clr的異常信息),如果你有這方面的需求可以通過SOAP的Fault包的形式返回異常信息,首先要做的就是設置配置文件,將默認不允許返回錯誤信息的設置改成如下:

    <behaviors>
      <serviceBehaviors>
        <behavior  name="Bhc">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/><!--如此設置會將服務器端得錯誤返回到客戶端,實際的發佈中需要將此項目設置成false-->
        </behavior>
      </serviceBehaviors>      
    </behaviors>

然後定義承載信息的DataContract

    [DataContract]
    public class Erro
    {
        [DataMember]
        public string Message
        {
            get; set;
        }
    }

上邊的代碼 就不用介紹了 就是一個數據合同

    //服務契約定義了可以遠程調用的對象和方法
    //定義服務契約
    [XmlSerializerFormat]//定義序列化的方式
    [ServiceContract(SessionMode = SessionMode.Allowed)]//SessionMode = SessionMode.Allowed:設置此屬性意味著可以使用會話Binding
    public interface IActionMain
    {
        //定義操作契約
        [DataContractFormat]//定義序列化的方式
        [OperationContract]
        string GetName(string pInc);

        [FaultContract(typeof(ErroInfo.Erro))]//如果有異常就返回下面定義的數據契約的結構數據
        [FaultContract(typeof(DivideByZeroException))]
        [OperationContract]
        DataCollection Return();
    }

在方法中定義屬性,這裏有兩種實現

1.使用自定義的錯誤類型         [FaultContract(typeof(ErroInfo.Erro))]//如果有異常就返回下面定義的數據契約的結構數據

2.使用系統的異常類型         [FaultContract(typeof(DivideByZeroException))] 在契約實現類中將異常拋出

throw new FaultException<DivideByZeroException>(new DivideByZeroException("這個是自定義的異常!"));

到此服務器端的實現完成。

下邊看客戶端的實現

配置文件不需要特殊設置,調用函數,抓取異常,代碼如下:

            try
            {
                return this.Channel.Return();
            }
            catch (FaultException<ErroInfo.Erro> exception)
            {
                throw new Exception(exception.Detail.Message);
            }
            catch(FaultException<DivideByZeroException> exception)
            {
                throw new Exception(exception.Detail.Message);
            }

FaultException<ErroInfo.Erro> exception:這個抓取的是定義的異常類型。

FaultException<DivideByZeroException> exception:這個抓取的是系統異常類型

注意這裏獲取異常的信息的方法是exception.Detail.Message,而不是Message。

運行效果如下:

示例代碼:Demo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章