麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

WCF服務創建與拋出強類型SOAP Fault

2019-11-17 01:50:14
字體:
來源:轉載
供稿:網友

WCF服務創建與拋出強類型SOAP Fault

原創地址:http://www.companysz.com/jfzhu/p/4060666.html

轉載請注明出處

前面的文章《WCF服務的異常消息》中介紹過,如果WCF Service發生異常時,Service會將異常序列化為SOAP Fault并發送給客戶端。

默認情況下,出于安全原因,WCF Service中未處理的異常的詳細信息不會包括在發送給客戶的SOAP Fault里,你只能看到一個通用的SOAP Fault(“The server was unable to PRocess the request due to an internal error.”)。在調試程序的時候,如果想在SOAP Fault中包含異常的詳細信息,可以修改服務器的配置文件。

<behaviors>  <serviceBehaviors>    <behavior name="includeExceptionDetails">      <serviceDebug includeExceptionDetailInFaults="true" />    </behavior>  </serviceBehaviors></behaviors>

SOAP Fault是xml格式,與平臺無關。通常一個SOAP Fault包含以下節點

(1) faultcode

(2) faultstring

(3) detail

Detail節點可以用來包括自定義XML信息。

WCF Service在發生異常時應拋出FaultException或FaultException<T>,而不應該拋出.NET Exception,出于以下兩個原因:

(1)未處理的.NET Exception會使服務器與客戶端之間的channel變為Fault狀態,繼而導致client proxy無法使用。

(2).NET Exception只能被.NET平臺理解,而FaultException與平臺無關。如果想跨平臺使用,需要使用FaultException。

下面還是以中《WCF服務的異常消息》的例子來分別演示如何拋出與處理FaultException與強類型的FaultException<T>。

(一)使用FaultException

IDemoService.cs:

using System.ServiceModel;namespace WCFDemo {        [ServiceContract(Name = "IDemoService")]     public interface IDemoService     {         [OperationContract]                int Divide(int numerator, int denominator);     } }

DemoService.cs:

using System; using System.ServiceModel; using System.ServiceModel.Activation;namespace WCFDemo {     [aspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]     public class DemoService : IDemoService     {         public int Divide(int numerator, int denominator)         {             if (denominator == 0)             {                 throw new FaultException("Denominator cannot be ZERO!", new FaultCode("DivideByZeroFault"));             }             return numerator / denominator;                   }     } }

client:

private void buttonCalculate_Click(object sender, EventArgs e) {     try     {                        textBoxResult.Text = demoServiceClient.Divide(Convert.ToInt32(textBoxNumerator.Text), Convert.ToInt32(textBoxDenominator.Text)).ToString();     }     catch (FaultException fault)     {         MessageBox.Show(fault.Code + " - " + fault.Message);     } }

image

image

SOAP Fault XML

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">   <s:Body>     <s:Fault>       <faultcode>s:DivideByZeroFault</faultcode>       <faultstring xml:lang="en-US">Denominator cannot be ZERO!</faultstring>     </s:Fault>   </s:Body> </s:Envelope>

(二)使用強類型FaultException<T>

(1)創建一個自定義SOAP Fault類

DivideByZeroFault.cs:

using System.Runtime.Serialization;namespace WCFDemo {     [DataContract]     public class DivideByZeroFault     {         [DataMember]         public string Error { get; set; }        [DataMember]         public string Detail { get; set; }     } }

(2) 在Service方法上使用FaultContractAttribute來指示哪個操作可以使用哪個Fault

IDemoService.cs:

using System.ServiceModel;namespace WCFDemo {        [ServiceContract(Name = "IDemoService")]     public interface IDemoService     {         [FaultContract(typeof(DivideByZeroFault))]         [OperationContract]                int Divide(int numerator, int denominator);     } }

DemoService.cs:

using System; using System.ServiceModel; using System.ServiceModel.Activation;namespace WCFDemo {     [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]     public class DemoService : IDemoService     {         public int Divide(int numerator, int denominator)         {             try             {                 return numerator / denominator;             }             catch (DivideByZeroException ex)             {                 DivideByZeroFault fault = new DivideByZeroFault();                 fault.Error = ex.Message;                 fault.Detail = "Denominator cannot be ZERO!";                 throw new FaultException<DivideByZeroFault>(fault);             }         }     } }

client:

private void buttonCalculate_Click(object sender, EventArgs e) {     try     {                        textBoxResult.Text = demoServiceClient.Divide(Convert.ToInt32(textBoxNumerator.Text), Convert.ToInt32(textBoxDenominator.Text)).ToString();     }     catch (FaultException<DemoServiceReference.DivideByZeroFault> fault)     {         MessageBox.Show(fault.Detail.Error + " - " + fault.Detail.Detail);     } }

image

image

返回的SOAP Fault XML:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">   <s:Body>     <s:Fault>       <faultcode>s:Client</faultcode>       <faultstring xml:lang="en-US">The creator of this fault did not specify a Reason.</faultstring>       <detail>         <DivideByZeroFault xmlns="http://schemas.datacontract.org/2004/07/WCFDemo" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">           <Detail>Denominator cannot be ZERO!</Detail>           <Error>Attempted to divide by zero.</Error>         </DivideByZeroFault>       </detail>     </s:Fault>   </s:Body> </s:Envelope>

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 在线视频 欧美日韩 | 成人三级电影网址 | 欧美一级特黄aaaaaaa什 | 国产精品91久久久 | av在线播放地址 | 一级免费在线视频 | 久久在线精品视频 | 欧美亚洲啪啪 | 国产1区2区在线 | 精品xxxx户外露出视频 | 免费国产视频大全入口 | 成人午夜高清 | 国产69精品久久久久久 | 7m视频成人精品分类 | 久久久久久久久久91 | 久久精品无码一区二区日韩av | 欧美ab | 精品亚洲二区 | 国产欧美精品一区二区三区四区 | 国产在线精品一区二区不卡 | 国产精品亚洲三区 | 蜜桃欧美性大片免费视频 | 久久亚洲成人网 | 久久99国产精品视频 | 免费一级a毛片在线播放视 日日草夜夜操 | 澳门一级淫片免费视频 | 视频一区二区不卡 | 国产在线精品区 | 亚洲一区二区三区四区精品 | 欧日韩在线视频 | 色偷偷欧美| 欧美激情第一区 | 制服丝袜成人动漫 | 香蕉久久久久 | 精品亚洲视频在线观看 | 亚洲午夜影院在线观看 | 美国一级免费视频 | 男女隐私免费视频 | 亚洲综合视频网 | 欧洲伊人网 | 日韩视频网址 |