.NET基礎拾遺(7)Web Service的開發與應用基礎
一、SOAP和Web Service的基本概念
Web Service基於SOAP協議,而SOAP本身符合XML語法規範。雖然.NET為Web Service提供了強大的支援,但瞭解其基本機制對於程式設計師來說仍然是必需的。
1.1 神馬是SOAP協議?
SOAP協議的全稱是簡單物件訪問協議(Simple Object Access Protocol),SOAP致力於以XML形式提供一個簡單、輕量的用於在分散或分佈環境中交換結構化和型別資訊的機制。SOAP只規範物件訪問的方式,而不限制具體實現的技術環境,這意味著SOAP協議是一種跨平臺的協議:一個.NET客戶端程式可以按照SOAP協議訪問一個基於JavaEE技術體系結構的Web Service。SOAP訪問仍然基於HTTP協議,同時其內容又以XML形式展現。
SOAP規範由四部分組成:
① SOAP信封(SOAP envelop)
② SOAP編碼規則(SOAP encoding rules)
③ SOAP RPC表示(SOAP RPC representation)
④ SOAP繫結(SOAP binding)
這裡不對這四部分展開介紹,通過下面的一個小例子來直觀地認識一下。
(1)在Web服務端,打算對外提供一個公共方法來供客戶端呼叫,而客戶端則需要提供這個方法需要的引數,並且最終得到返回值。假設這個方法被申明在MySimpleService.asmx檔案中:
[WebMethod]public string GetSumString(int para1, int para2) { int result = para1 + para2; return result.ToString(); }
(2)當客戶端試圖使用這個Web Service方法時,就需要向伺服器端發出這樣的一個HTTP請求:
POST /MySimpleService.asmx HTTP/1.1 Host: localhost Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://tempuri.org/GetSumString"<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <GetSumString xmlns="http://tempuri.org/"> <para1>250</para1> <para2>250</para2> </GetSumString> </soap:Body> </soap:Envelope>
(3)等到Web Service伺服器端接收到上面的請求之後,就可以進行相應的邏輯處理,並且返回結果。根據SOAP協議,HTTP響應如下形式:
HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <GetSumStringResponse xmlns="http://tempuri.org/"> <GetSumStringResult>500</GetSumStringResult> </GetSumStringResponse> </soap:Body> </soap:Envelope>
如此一來,客戶端就得到了服務端的處理結果,換句話說,客戶端已經得到了Web Service提供的服務。
PS:最後,再說一下SOAP協議和HTTP協議,它們的關係非常類似於網路分層中的上下層協議,使用SOAP協議的雙方將SOAP資料包放入HTTP報文之中,並且通過HTTP協議完成實際的傳輸,換句話說,SOAP是對HTTP的一個封裝,下圖說明了這一過程:
1.2 WSDL又是什麼鬼,它有啥作用?
(1)WSDL介紹
WSDL(Web Service Description Language)是Web服務描述語言,它是一種由微軟、IBM、Intel等大型供應商提出的語言規範,目的就是為了描述Web伺服器所提供的服務,以供使用者參考。WSDL是一種複合XML語法規範的語言,它的設計完全基於SOAP協議,當一個Web Service伺服器期望為使用者提供服務說明時,WSDL是最好的選擇之一。
這裡仍以上面的例項來說明,在Web服務端提供了這樣一個方法:
string GetSumString(int para1, int para2)
當服務端檢視利用WSDL告訴客戶端如何使用該方法時,就會提供下面的這樣一個WSDL檔案(仍然是一個XML):
<?xml version="1.0" encoding="utf-8"?> <wsdl:definitions xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <wsdl:types> <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/"> <s:element name="GetSumString"> <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="para1" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="para2" type="s:int" /> </s:sequence> </s:complexType> </s:element> <s:element name="GetSumStringResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="GetSumStringResult" type="s:string" /> </s:sequence> </s:complexType> </s:element> </s:schema> </wsdl:types> <wsdl:message name="GetSumStringSoapIn"> <wsdl:part name="parameters" element="tns:GetSumString" /> </wsdl:message> <wsdl:message name="GetSumStringSoapOut"> <wsdl:part name="parameters" element="tns:GetSumStringResponse" /> </wsdl:message> <!-- 這裡省略其他定義 --> </wsdl:definitions>View Code
如上xml所示,在<wsdl:types>節點下,WSDL定義了GetSumString方法的名字:
<s:element name="GetSumString">
引數數量、每個引數的型別:
<s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="para1" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="para2" type="s:int" /> </s:sequence> </s:complexType>
以及返回引數的型別:
<s:element name="GetSumStringResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="GetSumStringResult" type="s:string" /> </s:sequence> </s:complexType> </s:element>
通過完整的描述,使用者就能夠了解如何使用該Web服務了。
(2)獲取和使用WSDL
當Web Service伺服器提供WSDL時,就可以通過特定的工具獲得WSDL檔案。最直接的方式就是在URL中直接新增WSDL引數,來發送得到WSDL檔案的請求,如下所示:
http://localhost:6105/MySimpleService.asmx?wsdl
這時點選回車就可以得到如下圖所示的WSDL結果:
1.3 Web Service中如何處理附件?
儘管Web Service提供的方法的引數型別沒有任何限制,也就意味著所有的附件可以通過位元組陣列來進行傳遞,但是把位元組流直接內嵌在SOAP訊息的做法有很多問題,這也曾經成為XML語法和SOAP協議被詬病的原因。這裡主要介紹一下XOP的概念。
在XOP出現之前,SOAP處理二進位制資料的方式都很簡單,比如當一個Web Service服務端提供瞭如下的方法時:
void UploadSmallAttach(Byte[] attachment)
客戶端呼叫該Web Service,只需要發出下面這樣的SOAP請求即可:
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <UploadSmallAttach xmlns="http://tempuri.org/"> <attachment>D0CF11E0A1B11AE100000000000000000000000003E0000300FEFF09000600000000000000000000000600000000000000000000DE0200000000000000000000001000000000000000FEFFFFFFFF00000000000000000000D80200000000000D9020000DA02000DB02000000DC020000DD0200000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF</attachment> </UploadSmallAttach> </soap:Body> </soap:Envelope>
如上所示,其中<attachment>節點下的一大堆字元,就是某個檔案的位元組流。通過這種方式,確實是可以實現傳送二進位制附件的功能的,但這樣的處理過於粗略,且傳輸沒有任何優化。W3C為此特別指定了XOP規範。
XOP(XML-binary Optimized Packages)意為XML二進位制打包,它把二進位制資料流從SOAP訊息中分離出來,進行單獨打包。上述的客戶端請求如果使用XOP規範的話,將轉變為如下結果:
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <UploadSmallAttach xmlns="http://tempuri.org/"> <attachment>
<xop:Include xmlns="http://www.w3.org/2015/10/02/xop/include" href="cid:http://www.book.com/attachment.png" />
</attachment> </UploadSmallAttach> </soap:Body> </soap:Envelope>
可以看到,原本出現在二進位制位元組流的地方,被轉換成了一個引用:
<attachment> <xop:Include xmlns="http://www.w3.org/2015/10/02/xop/include" href="cid:http://www.book.com/attachment.png" /> </attachment>
這樣整個SOAP信封節點下就不再包含任何二進位制直接,而福建則被安放在另一個MIME體中:
Content-Type: image/png Content-Transfer-Encoding: binary Content-ID: <sample@book.com> D0CF11E0A1B11AE100000000000000000000000003E0000300FEFF09000600000000000000000000000600000000000000000000DE0200000000000000000000001000000000000000FEFFFFFFFF00000000000000000000D80200000000000D9020000DA02000DB02000000DC020000DD0200000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
二、使用.NET開發Web Service
.NET為Web Service提供了全面的支援,無論是建立Web Service還是訪問Web Service,使用.NET都能快速有效地完成需求。
2.1 如何在.NET中建立Web Service?
(1)使用WebMethod特性建立Web Service
在.NET中,所有Web Service的資源被定義為asmx檔案,而在ASP.NET被安裝時,asmx檔案也會在IIS中被註冊成由ASP.NET元件來處理。也就是說,一個asmx檔案和其後臺程式碼asmx.cs組成了一個Web Service資源。
為了讓我們能夠把注意力集中在邏輯的處理上,而忽略SOAP通訊的工作,.NET提供了Web Service型別和WebMethod特性。在繼承自Web Service型別的公共方法上新增WebMethod特性,就可以申明為一個Web Service方法。
① 建立一個Web服務
② asmx檔案只是簡單地聲明瞭後臺程式碼的位置,而不包含任何工作程式碼。後臺程式碼都在asmx.cs中:
/// <summary> /// MySimpleService 的摘要說明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允許使用 ASP.NET AJAX 從指令碼中呼叫此 Web 服務,請取消註釋以下行。 // [System.Web.Script.Services.ScriptService] public class MySimpleService : System.Web.Services.WebService { [WebMethod] public string GetSumString(int para1, int para2) { int result = para1 + para2; return result.ToString(); } }View Code
Luckily,WebService和WebMethod為我們提供了完全包裝好的SOAP處理功能,而在大多數情況下,我們所要做的就是繼承和使用它們。
(2)建立自定義的型別來處理對asmx檔案的請求
在ASP.NET的處理機制中,所有的HTTP請求通道都通過管道來尋找處理程式。我們所熟悉的WebForm和WebService,都是實現了IHttpHandler介面的Http處理程式,這導致了它們有能力處理特定的Http請求。事實上,我們可以通過配置Web.config來自定義Http處理程式和資源的對映匹配關係,如同下面的配置所展示的一樣:
<httpHandlers> <add verb="*" path="*.ashx" type="System.Web.UI.SimpleHandlerFactory"/> <add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/> <add verb="*" path="*.asmx" type="System.Web.Services.Protoclos.WebServiceHandlerFactory"/> </httpHandlers>
實現IHttpHandler介面很簡單,必須的工作就僅僅是實現一個ProcessRequest方法和一個只讀屬性:
public void ProcessRequest(HttpContext context) public bool IsReusable
在HttpContext型別的上下文物件中包含了Http請求(HttpRequest),也包含了Http返回型別物件(HttpResponse),並且允許程式設計師往裡面寫入希望的返回內容。IsReusable屬性則返回當前物件是否可被重用來應對所有類似的Http請求。
鑑於此,我們可以自己實現一個實現IHttpHandler介面的處理程式,在配置檔案中將其繫結到.asmx檔案上,就可以實現Web Service方法了。當然,為了符合SOAP規範,我們需要在ProcessRequest方法中解析SOAP請求,並且把返回值放入一個SOAP包中。
下面的程式碼示例展示瞭如何自定義asmx處理程式(這裡只展示瞭如何編寫實現IHttpHandler介面的型別並使其工作,省略了繁瑣的SOAP解析和組織工作)
① 新建一個ashx程式,實現IHttpHandler介面
/// <summary> /// MySimpleHandler 的摘要說明 /// </summary> public class MySimpleHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.Write("<h1>Hello Web Service!</h1>"); } public bool IsReusable { get { return true; } } }View Code
② 修改Web.config檔案,加入自定義HttpHandler型別
<add verb="*" path="*.asmx" type="MyWebApp.MySimpleHandler,MyWebApp"/>
(3)自定義Web Service資原始檔和處理程式
事實上,我們完全可以定義一種新的資原始檔而不是採用asmx檔名,只要我們為其定製HttpHandler程式。需要做的工作為:
① 定義一個新的檔案格式如asnew,在IIS中匹配asnew和aspnet_isapi.dll處理程式;
② 自定義一個實現了IHttpHandler介面的型別,在這個型別中實現SOAP;
③ 在需要使用asnew檔案的站點配置檔案中繫結asnew和新的Http處理型別;
這樣的方案顯然可以為系統帶來更大的靈活性,但同時也意味著更大的程式碼量。下圖展示了三種實現Web Service的方法之間的關係:
2.2 WebMethod特性包含哪些屬性,各有神馬用處?
WebMethod特性在Web Service中被用來申明一個公開方法,瞭解其使用方法是在正確編寫Web Service的基礎。在WebMethod特性中,一共包含了6個屬性,這6個屬性對WebMethod的使用非常重要。
(1)BufferResponse屬性
該屬性表明是否啟用對Web Service方法響應的緩衝。當設定為true時,Web Service方法將響應序列化到記憶體緩衝區中,直到快取區被用滿或者響應結束後,響應才會被髮送給客戶端。相反,設定為false時,.NET預設以16KB的塊區緩衝響應,響應在被序列化的同時將會被不斷髮送給客戶端,無論該響應是否已經完全結束。
PS:預設BufferResponse被設定為true。當Web Service要傳送大量資料流給客戶端時,設定BufferResponse為false時可以防止大規模資料一次性重新整理到記憶體,而對於小量資料,設定為true則可以有效地提高效能。
(2)EnableSession屬性
該屬性指定是否啟用會話狀態。如果為true,則啟用,為fasle則禁用。預設被設定為false。
public class MySimpleService : System.Web.Services.WebService { [WebMethod(EnableSession = true)] public string WithSession() { return TryGetSession(); } [WebMethod(EnableSession = false)] public string WithoutSession() { return TryGetSession(); } private string TryGetSession() { if (Session == null) { return "Session is Forbidden"; } if (Session["number"] == null) { Session["number"] = 0; } Session["number"] = (int)Session["number"] + 1; return Session["number"].ToString(); } }View Code
分別訪問WithSession和WithoutSession方法,結果如下圖所示:
(3)CacheDuration屬性
該屬性指示啟用對Web Service方法結果的快取。服務端將會快取每個唯一引數集的結果,該屬性的值指定伺服器端應該對結果進行多少秒的快取處理。如果該值為0,則禁用對結果進行快取;如果不為零,則啟用快取,單位為秒,意為設定多少秒的快取時間。預設該值被設為0。
[WebMethod(CacheDuration = 10, EnableSession = true)] public string WithCache() { if (Session["number"] == null) { Session["number"] = 0; } Session["number"] = (int)Session["number"] + 1; return Session["number"].ToString(); }View Code
上面的WithCache方法設定了10秒的快取時間,即10秒內的訪問都會得到一樣的結果。
(4)Description屬性
該屬性很簡單,提供了對某個Web Service方法的說明,並且會顯示在服務幫助頁上面。
(5)MessageName屬性
該屬性是Web Service能夠唯一確定使用別名的過載方法。除非另外指定,預設值是方法名稱。當指定MessageName時,結果SOAP訊息將反映該名稱,而不是實際的方法名稱。
當Web Service提供了兩個同名的方法時,MessageName屬性會很有用,這一點將會體現在WSDL中:
[WebMethod(MessageName="HelloWorld1")] public string HelloWorld(int num) { return num.ToString(); } [WebMethod(MessageName = "HelloWorld2")] public string HelloWorld() { return "Hello World!"; }View Code
(6)TransactionOption屬性
該屬性用以設定Web Service方法的事務特性,在.NET中事務模型是基於宣告性的,而不是編寫特定的程式碼來處理提交和回滾事務。在Web Service中,可以通過TransactionOption屬性來設定該方法是否需要被放入一個事務之中。如果申明瞭事務屬性,執行Web Service方法時引發異常會自動終止事務,相反如果未發生任何異常,則自動提交事務。
事務最常用的一個場景就是資料庫訪問,所以該屬性在利用Web Service實現的分散式資料庫訪問中就特別有用。
2.2 如何生成Web Service代理型別?
(1)Web Service代理類的概念
所謂的代理類,就是SOAP協議的代理型別,它使得我們可以通過呼叫本地的型別方法(代理類),來達到訪問Web Service方法的目的。代理類的最終目的就是將程式設計師從繁瑣的SOAP訊息處理和XML解析中解放出來,而專注於邏輯工作。下圖說明了代理類的作用:
(2)如何生成Web Service代理類
在Visual Studio中提供了一個很簡單的生成Web Service代理類的方法就是Web引用,如下圖所示:
當Web引用被新增後,一個代理型別也會自動生成。並且,當服務端的Web Service更新後,我們只需要簡單地更新一下Web引用,就可以方便地更新代理型別。
在客戶端邏輯中,只需要呼叫代理類的對應介面就OK,十分簡單:
class Program { static void Main(string[] args) { using (MySimpleServiceSoapClient proxy = new MySimpleServiceSoapClient()) { string result = proxy.GetSumString(250, 250); Console.WriteLine("250+250={0}", result); } Console.ReadKey(); } }View Code
執行結果為:
2.3 簡述.NET中Web Service的異常機制
即使有了本地的代理類,呼叫Web Service方法還是呼叫本地方法有所區別,如果Web Service出現了異常,那麼這些異常資訊就需要被封裝在SOAP資訊中傳送回客戶端。
(1)SOAP中對異常的規定
SOAP規定了異常資訊的攜帶方式,那就是全被放入fault節點中。fault節點必須是Body節點的子節點,而且一個SOAP訊息只能出現一個fault節點。
子節點 | 描述 |
<faultcode> | 識別故障的程式碼 |
<faultstring> | 供認閱讀的有關故障的說明 |
<faultactor> | 是誰引發異常 |
<detail> | 存留設計Body元素的應用程式專用錯誤資訊 |
其中faultcode是一個錯誤碼,其取值和每個值所代表的含義都在SOAP中有所定義,下表列出了所有faultcode及其含義:
faultcode節點值 | 描述 |
VersionMismatch | SOAP Envelop元素的無效名稱空間被發現 |
MustUnderstand | Header元素的一個直接子元素無法被理解 |
Client | 訊息被不正確地構成,或包含了不正確的資訊 |
Server | 伺服器有問題,因此無法處理進行下去 |
(2)服務端對未捕獲異常的處理
在使用WebService型別和WebMethod特性建立Web Service的情況下,伺服器端的異常都會被捕捉,並且所有異常都會被放入到SoapException型別中,並且返回給客戶端。我們可以在服務端程式碼中直接使用SoapException異常,通過設定其屬性來告知客戶端:
① Message:原始異常的Message屬性
② Code:伺服器異常碼
③ Actor:Web Service方法的URL
④ Detail:空引用,但有一個空的詳細資訊元素存在於故障元素之中
服務端會把SoapException放入Fault節點之中並返回給客戶端,以此來告知服務端發生的異常。
(3)客戶端代理類對fault節點的處理
如果使用.NET自動生成的Web Service代理類,那麼它將能夠自動地識別fault節點,並且還原為SoapException異常。這裡可以通過下面的一段程式碼示例來直觀地瞭解這一點:
① 首先在Web Service方法中直接丟擲一個異常,如下程式碼所示:
[WebMethod] public string HelloException() { // 直接丟擲一個異常,該異常會被包裝為SoapException throw new Exception("發生了一個異常!"); }View Code
② 其次根據這個Web Service在本地生成對應代理類,並且通過try-catch捕捉從服務端傳送來的SoapExcetpion:
class ServiceClient { static void Main(string[] args) { using (MySimpleServiceSoapClient proxy = new MySimpleServiceSoapClient()) { try { // 這裡異常將會被代理類丟擲 proxy.HelloException(); } catch (SoapException ex) { // 列印異常資訊內容 Console.WriteLine("Actor:{0}", ex.Actor); Console.WriteLine("CodeName:{0}", ex.Code.Name); Console.WriteLine("Detail:{0}", ex.Detail.InnerText); Console.WriteLine("Message:{0}", ex.Message); } } Console.ReadKey(); } }View Code
參考資料
(1)朱毅,《進入IT企業必讀的200個.NET面試題》
(2)張子陽,《.NET之美:.NET關鍵技術深入解析》
(3)王濤,《你必須知道的.NET》
作者:周旭龍
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。
相關推薦
.NET基礎拾遺(7)Web Service的開發與應用基礎
一、SOAP和Web Service的基本概念 Web Service基於SOAP協議,而SOAP本身符合XML語法規範。雖然.NET為Web Service提供了強大的支援,但瞭解其基本機制對於程式設計師來說仍然是必需的。 1.1 神馬是SOAP協議? SOAP協議的全稱是簡單物件訪問協議
.NET基礎拾遺(5)多執行緒開發基礎
一、多執行緒程式設計的基本概念 下面的一些基本概念可能和.NET的聯絡並不大,但對於掌握.NET中的多執行緒開發來說卻十分重要。我們在開始嘗試多執行緒開發前,應該對這些基礎知識有所掌握,並且能夠在作業系統層面理解多執行緒的執行方式。 1.1 作業系統層面的程序和執行緒 (1)程序 程序
.NET基礎拾遺(1)型別語法基礎和記憶體管理基礎
一、基礎型別和語法 1.1 .NET中所有型別的基類是什麼? 在.NET中所有的內建型別都繼承自System.Object型別。在C#中,不需要顯示地定義型別繼承自System.Object,編譯器將自動地自動地為型別新增上這個繼承申明,以下兩行程式碼的作用完全一致: public
.NET基礎拾遺(6)ADO.NET與資料庫開發基礎
一、ADO.NET和資料庫程式基礎 1.1 安身立命之基本:SQL SQL語句時操作關係型資料庫的基礎,在開發資料訪問層、除錯系統等工作中十分常用,掌握SQL對於每一個程式設計師(無論是.NET、Java還是C++等)都非常重要。這裡挑選了一個常見的面試題目,來熱熱身。 常見場景:通過SQL
.NET基礎拾遺(3)字串、集合和流
一、字串處理 1.1 StringBuilder型別有什麼作用? 眾所周知,在.NET中String是引用型別,具有不可變性,當一個String物件被修改、插入、連線、截斷時,新的String物件就將被分配,這會直接影響到效能。但在實際開發中經常碰到的情況是,一個String物件的最終生成需要經過
.NET基礎拾遺(2)面向物件的實現和異常的處理基礎
一、面向物件的實現 1.1 C#中的類可以多繼承嗎? 在C#中申明一個型別時,只支援單繼承(即繼承一個父類),但支援實現多個介面(Java也是如此)。像C++可能會支援同時繼承自多個父類,但.NET的設計小組認為這樣的機制會帶來一些弊端,並且沒有必要。 首先,看看多繼承有啥好處?多繼承的
.NET基礎拾遺(4)委託、事件、反射與特性
一、委託基礎 1.1 簡述委託的基本原理 委託這個概念對C++程式設計師來說並不陌生,因為它和C++中的函式指標非常類似,很多碼農也喜歡稱委託為安全的函式指標。無論這一說法是否正確,委託的的確確實現了和函式指標類似的功能,那就是提供了程式回撥指定方法的機制。 在委託內部,包含了一個指向某個方
【WEB基礎】HTML & CSS 基礎入門(7)表格
表格的基本結構 表格是網頁上最常見的元素,它除了可以用來展示資料,還常常被用來排版。雖然現在提倡使用DIV+CSS完成頁面佈局,但表格框架簡單明瞭,對於繁雜的資料,一個簡潔的表格能讓其展現的極有條理。 簡單來說,表格是由行、列(單元格)組成。表格由 <table> 標籤來定義。每個表格均有若干
Java基礎筆記(7)----三個修飾符
共享 sta strac span 成員 abstract 化工 聲明 訪問修飾符 abstract抽象 方法 抽象方法:abstract修飾的方法,只有聲明 而沒有方法的實現(連{}都沒有)。 語法:修飾符 返回值類型 方法名(形參列表); 註意:抽象方
野生前端的資料結構基礎練習(7)——二叉樹
網上的相關教程非常多,基礎知識自行搜尋即可。 習題主要選自Orelly出版的《資料結構與演算法javascript描述》一書。 參考程式碼可見:https://github.com/dashnowords/blogs/tree/master/Structure/btree 一.二叉樹的
web前端學習(二)html學習筆記部分(7)--web儲存2
1.2.20 web儲存 1.2.20.1 Web儲存-客戶端儲存資料新方法 1.兩種方式 1)localStorage - 沒有時間限制的資料儲存 2)針對一個sessionStorage - 針對一個session的資料儲存 2.與coo
web測試基礎知識(一)web基礎
web測試的價值: a、挖掘測試深度,提高測試價值 客戶端/瀏覽器----應用伺服器----資料庫伺服器 資料從客戶端/瀏覽器接收,經過http協議、tcp/ip協議傳輸,來到應用伺服器,最後到達資料庫,前面我們分析過介面的輸入域,伺服器資料庫的後臺,但是我們沒有去關心
FPGA基礎設計(7)雙口RAM乒乓操作
雙口RAM經常用於跨時鐘域處理,且比FIFO靈活性更大。本文給出一個具體的設計例項,讓大家理解雙口RAM在跨時鐘域處理中乒乓操作的用法。 輸入資料速率20MHz,輸出資料速率100Mhz,使用雙口RAM完成跨時鐘域處理。一次傳輸的資料為1024個,假設資料位寬為
Linux.NET學習手記(7)
前一篇中,我們簡單的講述了下如何在Linux.NET中部署第一個ASP.NET MVC 5.0的程式。而目前微軟已經提出OWIN並致力於發展VNext,接下來系列中,我們將會向OWIN方向轉戰。 早在三週之前,我偶然的得到了一本《SignalR Programming in Microsoft ASP.NE
ASP.NET預備知識(四)--Web伺服器驗證控制元件
1 什麼是驗證控制元件? 希望使用者輸入正確的型別的資料,為了驗證使用者輸入是否滿足要求,必須對輸入的值、範圍或格式進行檢查。 2 .NET中驗證控制元件在哪裡? 在工具箱的驗證分組裡。 3 常
關於iOS基礎總結(7)--ios各個版本新特性總結
iOS7新特性 · 在iOS7當中,使用麥克風也需要取得使用者同意了。如果使用者不允許app使用麥克風的話,那麼需要使用麥克風的app就不能接收不到任何聲音 · [NSArray firstObject]的實現,iOS4之前只是一個私有的方法 · UIIm
Tensorflow學習筆記:基礎篇(7)——Mnist手寫集改進版(Tensorboard視覺化)
Tensorflow學習筆記:基礎篇(7)——Mnist手寫集改進版(Tensorboard視覺化介面) 前序 — 前文中,我們在三層全連線神經網路中使用了學習率隨迭代次數增加而逐漸衰減的AdamOptimizer優化器來完成MNIST資料的分類問題,最
13.3Python基礎拾遺(3):斐波那契數列的遞迴、非遞迴、生成器實現
@斐波那契數列 fibonacci數列的前幾項是這樣的:0,1,1,2,3,5,8…; 即從第三項開始的每一項,等於前面兩項之和; 通過令程式和裝置求fibonacci數列的某一高位項,是運算力測試
Python的語言基礎總結(二)之循環與字符串操作
整數 範圍 輸入 IV 字符串 spl 余額 upper ict 一、循環和分支 1. 條件分支語句 if 條件: 代碼塊 else: 代碼塊 2. 循環語句之while 思考1:求1+2+3+....+10的值 sum =
ASP.NET SignalR 系列(九)之源碼與總結
pan ie7 集線器 增加 地址 註意 ocs pac mic 1、SignalR 1.0與2.0有些不同,以上篇章均只支持2.0+ 2、必須註意客戶端調用服務端對象和方法時的大小寫問題 3、客戶端上的方法不能重名 4、IE7及以下的,需要增加json的分析器,分析器下載