導航:首頁 > 編程語言 > wcf服務編程pdf下載

wcf服務編程pdf下載

發布時間:2023-05-30 08:28:09

① 跪求WCF的工作原理

首先:

WCF的全稱是,Windows通信基礎的意思,是Microsoft為構建面向服務的應用程序而提供的統一編程模型,它整合.NET平台下所有和分布式系統有關的技術。

其次:

WCF本質是面向服務的。主要分為服務端和客戶端兩部分。服務端和客戶端進行通信的過程如下圖所示:

在上圖中,主機進程就是服務端,在其中需要創建服務,然後將服務通過EndPoint(終結點)與客戶端進行通信。客戶端在使用服務時,需要首先創建一個代理服務,然後調用這個代理服務。

EndPoint(終結點)在WCF中是非常重要的部分。它包含了服務地址(Address)、綁定格式(Binding)和契約(Contract)。其中,地址定義了服務的位置,綁定定義了服務通信的方式,契約定義了服務所提供的功能。為了便於記憶,我們將終結點的這三個要素簡稱為服務的ABC

服務端提供了什麼服務,都具備什麼功能,燃帆這被稱為WCF服務的契約。

WCF服務不能憑空存在。備段神每個WCF服務都必須託管(Hosting)在一個Windows進程中,該進程被稱為宿主進程。

WCF服務宿主可以由IIS提供,可以由Windows服仿虧務提供,也可以由WindowsVista的Windows激活服務提供。其中,使用IIS託管只能使用HTTP協議。

② WCF服務編程一書中寫到:契約操作不能使用引用對象參數,只允許使用基本類型或者數據契約

在過程調用中傳遞了一個無效參數。這可能是由於參數超出范圍,或包含無效數據。另外,有可能在不適當的時間對過程進行了調用。要糾正該錯誤驗證傳遞給過程的參數是有效的。驗證在適當的時間調用函數。溢出試圖賦給變數的賦值太大,這是因為:賦值,計算或者數據類型轉換結果很大以至於不能代表此種類型變數值的范圍。屬性賦值超出了屬性所能接受的最大值。整數類型數字的計算結果大於一個整數。要糾正該錯誤將值賦給一個較大取值范圍的變數類型。確保賦值符合屬性范圍。內存不足分配與該計算機有效內存一樣多的內存。這可能是一個動態分配數組增長得太大,或者是對象實例數目過多。要糾正該錯誤使用Erase語句來重新分配動態數組的儲存空間。使用ReDim語句來重新分配儲存空間。關閉任何已經打開、不必需的應用程序,文件或者源文件。下標越界要訪問的數組中元素數目比期望的少。例如試圖從一個定義為10個元素的數組中訪問到11個元素。.要糾正該錯誤確保你的代碼中包含檢察元素是否越界的邊界。重新定義一個更大的數組大小至需要的維數。該數組為定長的或者臨時被鎖定試圖用ReDim函數來改變一個定長數組的元素數目。動態數組或者Variant變數內的數組可以被暫時的鎖定。要糾正該錯誤如果在過程內部定義數組,用ReDim函數將其從靜態變為動態。如果在模塊水平上說明數組,不要指定數組中元素的數目。被零除創建一個試圖將數字被零除的表達式。被零除得到無窮大(不可用)結果。要糾正該錯誤檢查表達式的輸入或大小寫錯誤。類型不匹配試圖比較不相容數據類型的值。例如,比較一個字元串和一個數值。要糾正該錯誤當進行比較時,要確保數據類型相同。用一個的數據類型來計算另一個的值,然後重新比較。字元串空間溢出試圖創建字元串對象時系統內存被用盡。這可能是因為動態分配數組越來越大或對象實例的數目過大。要糾正該錯誤使用Erase語句來重新分配動態數組的儲存空間。使用ReDim語句來重新分配儲存空間。關閉任何已經打開、不必需的應用程序,文件或者源文件無法執行請求的操作當主機使腳本引擎中斷時無法繼續執行腳本。主機未指定明確的返回錯誤代碼。要糾正該錯誤該錯誤的解決與主機有關。堆棧溢出過程嵌套太深。每次代碼從一個過程跳到另一個過程,本地變數的內容被放到堆棧中。堆棧是一個大小隨著要求執行的腳本動態增長和縮小的內存工作區域。要糾正該錯誤檢查沒有嵌套很深的過程。確保遞歸(重入)過程沒有經常的調用自身。確保遞歸過程被正常終止。未定義Sub或Function試圖調用一個不存在的過程。要糾正該錯誤檢查過程的拼寫確保輸入正確。載入DLL錯誤應用程序引用了一個無法找到的DLL,一個DLL可能引用了另一個無法找到的DLL。要糾正該錯誤確保DLL存在。使用全路徑名引用DLL。獲得被引用的DLL並使其對其他DLL有效。內部錯誤發生內部錯誤。要糾正該錯誤除非這是由Raise方法產生,請與微軟產品服務聯系報告出現錯誤消息的情況。未設置對象變數試圖使用無效對象的對象屬性。如果遺漏了Set語句,將在對象引用產生錯誤。要糾正該錯誤為對象變數指定一個引用。For循環未初始化在腳本中執行跳到ForNext循環中間的結果。由於ForNext循環計數必須被初始化所以產生錯誤。下面演示了一個ForNext循環的正確結構。Forcounter=startToend[Stepstep][statements][ExitFor][statements]Next要糾正該錯誤移去跳轉至ForNext循環的語句。確保ForNext循環包含了所有必須的部分。非法使用Null試圖獲得一個為Null的Variant變數的值。你只能獲得包含有效值的Variant變數的值。Null是一個Variant一個用來指示一個數據項不包含任何有效數據的子類型。要糾正該錯誤確保變數包含有效數據。需要對象提供的對象無效(或無法認為是一個對象)。對屬性和方法的引用需要一個顯式的對象限定符。要糾正該錯誤提供一個對象限定符。檢查對象限定符的拼寫。ActiveX部件無法創建對象由於對象類未在系統注冊表中注冊或者是一個或多個相關的動態鏈接庫無效(DLLs),VB5.5運行時無法初始化對象。另外一種可能情況是,由於未找到或是已經損壞,對象所需的DLL不可用。要糾正該錯誤確保所有相關的DLLs有效。例如,數據存取對象(DAO)所需的DLLs在不同的平台下是不同的。你可能不得不返回到安裝程序查找該對象。InternetExplorer可能試圖創建對象,但是在InternetExplorer中沒有正確的安全許可。重置InternetExplorer安全設置並重試。類不支持自動化試圖操作一個並不支持自動化的對象屬性或方法。可以創建並將指針傳遞給不支持自動化的對象,但是不能獲取它的屬性和方法。要糾正該錯誤查創建對象應用程序的文檔中關於該類自動化使用的限制。注意對象可能已經通過使用CreateObject被創建,但可能已經通過主機對象模型被引入。在自動化操作中未找到文件名或類名使用GetObject函數,但是將一個不可識別的類或文件名作為參數。GetObject函數要求包含要獲取的對象的文件的完整的路徑和名稱,或者是在系統中注冊過的類名稱。要糾正該錯誤檢查名稱的拼寫錯誤,然後重試。確保class參數的名稱與在系統中注冊的相匹配。對象不支持該屬性或方法對該自動化對象指定了一個並不存在的屬性或方法。不是所有的對象都支持所有的屬性和方法。要糾正該錯誤檢查屬性和方法以確保沒有打字錯誤。參見對象的文檔獲取的信息。對象不支持此操作試圖引用該對象不支持的一個方法或屬性。不是所有的對象支持所用的操作。要糾正該錯誤檢查屬性和方法以確保沒有打字錯誤。參見對象的文檔獲取的信息。對象不支持當前的區域設置試圖操作一個不支持當前區域設置的對象。區域設置是和給定語言以及國家/地區相對應的一系列信息。本地影響預定義程序項的語言和本地特定設置。以下兩種情況時本地信息很重要:codelocale影響語言項例如關鍵詞,並且定義本地特定設置例如小數和列表分割符,日期格式和字元排列順序。systemlocale影響本地相關的功能執行。例如,當顯示數字或者將字元串轉換為日期時。使用操作系統提供的控制面板工具來設定系統。要糾正該錯誤檢查對象支持的區域設置。未找到命名參數調用一個過程並指定一個特別的參數,但是過程未被定義為接受以為名稱的參數。除非在過程定義中出現,一個命名參數不能在過程調用中使用。要糾正該錯誤檢查參數名稱是否正確拼寫,然後再試著調用過程。參數不可選調用過程但是參數數量錯誤。傳遞給過程的參數的數量必須與過程定義的參數數量相同。要糾正該錯誤檢查函數符號確保提供了所有必須的參數。錯誤的參數個數或無效的參數屬性值調用過程時如果:錯誤的過程名稱,或者,過程中參數數目錯誤,或者,參數類型錯誤。傳遞給過程的參數數目必須與過程定義中的參數數目相符。要糾正該錯誤檢查以確保傳遞給過程的參數列表與過程定義或聲明中的相符。對象不是一個集合試圖對一個不是Collection類型的對象進行只對Collection對象有效的操作。有些屬性、方法和操作僅可應用於Collection對象。Collection對象是包含一組互相關聯的對象的一種對象。一旦集合中發生了改變,一個對象在Collection對象中的位置也會發生改變;因此,Collection對象中的任何一個對象的位置都可能變化。要糾正該錯誤檢查對象或屬性名稱的拼寫。驗證對象是一個Collection對象。查看用來向集合中添加該對象的Add方法,確保語法正確且任何標識符的拼寫都正確。變數使用了VB不支持的自動化類型試圖使用類型庫或者對象庫中不被支持的數據類型,任何一門編程語言都不能使用類型庫或對象庫中的所有變數。要糾正該錯誤只使用VB識別的變數類型。遠程伺服器不存在或者不能訪問用CreateObject函數來建立一個遠程機器的對象,但是調用失敗,這是因為無法訪問遠程伺服器或者沒有包含特定的類。要糾正該錯誤檢驗遠程伺服器的名字是否正確。檢驗遠程伺服器的DCOM可用。使用dcomcnfg驗證安全許可權是否允許建立對象。無效圖片試圖載入一個無法識別格式的圖像。有效格式包括點陣圖(*.bmp),圖標(*.ico),以及Windows元文件(*.wmf)。要糾正該錯誤確保要載入的圖像文件的格式是有效的。變數未定義在腳本開始處用OptionExplicit語句,後來又使用一個未被說明的變數名稱。當使用OptionExplicit語句時,必須用Dim,Private,Public或者ReDim語句顯式地說明所有的變數。要糾正該錯誤使用OptionExplicit語句時,確保用Dim,Private,Public,OrReDim語句定義了所有的變數。腳本對象不安全試圖使用未被標識為腳本安全的對象。對象創建是否安全由主機決定。總的來說,允許不信任腳本進行有害操作(例如操作硬碟)的對象是不安全的。例如,使用作為客戶端的MicrosoftInternetExplorer運行FileingObject是不安全的,但是可以在帶有WindowsHost的本地機器使用該對象。要糾正該錯誤確保在使用一個安全的對象。與對象開發者聯系看是否為安全版本。閱讀對象文檔發現該對象是否安全。對象不能安全初始化試圖使用未被標識為初始化安全的對象。對象創建是否安全由主機決定。總的來說,允許不信任腳本進行有害操作(例如操作硬碟)的對象是不安全的。例如,使用作為客戶端的MicrosoftInternetExplorer運行FileingObject是不安全的,但是可以在帶有WindowsHost的本地機器使用該對象。要糾正該錯誤確保在使用一個安全的對象。與對象開發者聯系看是否為安全版本。閱讀對象文檔發現該對象是否安全。對象不能安全創建試圖使用一個未被標識為安全創建的對象。對象創建是否安全由主機決定。總的來說,允許不信任腳本進行有害操作(例如操作硬碟)的對象是不安全的。例如,使用作為客戶端的MicrosoftInternetExplorer運行FileingObject是不安全的,但是可以在帶有WindowsHost的本地機器使用該對象。要糾正該錯誤確保在使用一個安全的對象。與對象開發者聯系看是否為安全版本。閱讀對象文檔發現該對象是否安全。無效或不合格的引用試圖對不止一個對象使用With語句。With語句只能被非空對象使用。下面演示了一個With塊的正確結構。WithobjectstatementsEndWith要糾正該錯誤為With語句指定一個對象。類未定義引用未定義(通過New或Set語句)的類。要糾正該錯誤確保在引用類之前已經定義。發生異常腳本調用COM對象,然後產生異常。要糾正該錯誤除非該調用由Raise方法產生,請與產生錯誤的CM對象開發人員聯系。請與微軟產品服務聯系報告出現錯誤消息的情況。正則表達式中的語法錯誤搜索字元串的結構違背了VB正則表達式中的一個或多個語法規則。要糾正該錯誤保證常規的搜索字元串的表達式符合Perlde的表達語法。錯誤的數量詞當構造正則表達式的搜索模式時,沒有正確的說明匹配的字元串。要糾正該錯誤確保搜索模式是正確構造的。在正則表達式中需要']'試圖為正則表達式匹配創建一個字元類,但未包含右括弧。將單獨的字元組合放到方括弧里可以將其裝配到字元類中。例如,/[abc]/匹配字母「a」,「b」,或「c」中任意一個。要糾正該錯誤在正則表達式中添加右括弧。在正則表達式中需要')'試圖創建常規的嵌套表達式,但未包含「)」。在正則表達式中括弧有幾個目的。首先,它將分離的項組成為單個子表達式,所以項目可以通過*,+,?等等來當作一個單元來處理。要糾正該錯誤在常規的嵌套表達式中添加右(閉)括弧「)」。字元集越界試圖使用無效字元創建正則表達式。正則表達式是由字母數字和元字元組成的。要糾正該錯誤僅僅使用有效正則表達式字元來組成正則表達式。求採納為滿意回答。

③ WCF是什麼如何學習

Windows Communication Foundation (WCF)是一個面向服務編程的綜合分層架構。該架構的頂層稱為服務模型層(Service Model Layer),使用戶用最少的時間和經歷建立自己的軟體產品和外界通信的模型。它使得開發者能夠建立一個跨平台的安全、可信賴、事務性的解決方案,且能與已有系統兼容協作。 開發WCF服務的端點需要涉及下面幾個任務:坦型純開發服務契約:指定端點可用的WCF服務的操作。開發綁定:綁定指點端點讓咐與外界通信的協議。添加,刪除,更新和配置端點:在配置文件中添加和綁定端點(當然也可以用編碼的形式,但是不推薦。)租歲添加行為:一個行為就是一個組件,能增強服務,端點,和操作的運行時行為。

④ ASP.NET 3.5核心編程之AJAX Web Service的調用


AJAX模型基於兩個層次--客戶端應用程序層和伺服器應用程序層。在這種模型下,客戶端層向伺服器層發送請求,而伺服器層向客戶端層返回響應。伺服器端點通過URL標識,並通過源(feed)(通常為JSON[javaScript Object Notation]數據流)向客戶端暴露數據。伺服器層只是一個接收調用並將其轉發給應用程序業務邏輯層的外觀。
下圖描繪了整個模型:
為使 AJAX頁面能夠調用遠程服務,該服務必須滿足幾點要求,其中最關鍵中行的一點與端點和底層平台的位置有關。支持AJAX的服務必須位於調用者所處的域中。這意味著該服務必須是 XML Web服務(。asmx端吵孝點),必須以應用程序的形式寄放於同一Web伺服器的某個IIS應用程序中。
總的來說,對於 AJAX應用服務,有3種定義伺服器層服務的方式:
1. 帶有asmx端點的 XML Web服務。
2. 帶有svc端點的WCF服務。
3. 帶有aspx端點的頁面方法,這些方法定義在與主調頁面相同的頁面中。
"服務(Service)"這個詞往往被誤用。在AJAX中,服務指的是隸屬於應用程序的代碼(位於應用程序的域中),用於向客戶端暴露相應的功能。從根本上講,AJAX應用程序使用的服務一般不通過簡單對象訪問協議(SOAP)進行通信(而是使用JSON),不必是面向服務架構(SOA)中自治的服務。它們與自身所處平台和域綁定。因此,不能稱這里的服務為WS-*Web服務和SOA服務。
REST服務
針對AJAX應用程序的服務圍繞著暴露給Web客戶端數據和資源。二者可通過HTTP獲取,要求客戶端通過URL(也可以有HTTP標頭)來訪問數據和命令操作。客戶端與服務的交互是通過GET、POST、PUT和DELETE這樣的動作來完成。換言之,URL用於描述所要獲取的資源,HTTP動作用於描述對資源執行的操作。這類交互過程中交換的數據由簡單的格式表示,甚至可以用聯合格式(如RSS和ATOM)表示。
具有這些特性的服務為具象狀態傳輸(Representational State Transfer,REST)。
數據的序列化
AJAX調用包含作為參數傳給被調服務方法的數據及作為輸出返回的數據。這些數據是如何序列化的?
通信雙方都能理解的序列化格式為JavaScript對象表示法(JSON)。JSON是一種基於文本的格式,專門用於在不同層次間傳遞對象的狀態。JavaScript支持JSON,可通過JavaScript的eval函數將JSON兼容的字元串轉換為JavaScript對象。然而,如果JavaScript字元串代表自定義對象的狀態,那麼開發者應確保具有相應類的定義。
AJAX網路堆棧要負責為每個遠程傳遞的對象創建JSON字元串。在伺服器端,通過專門的格式化程序類接收數據,並通過。NET反射來填充與之匹配的託管類。在返回時,.NET託管類會被序列化為JSON字元串,並發送給客戶端。腳本管理器會確保引用這些JSON字元串的類(Web服務代理類)存在於客戶端。
下面給出一個描述對象狀態的JSON格式的示例:
{"ID":"ALFKI", "Company":"Alfred Futterkiste"}
這個字元串說明該對象有兩個屬性:ID和Company,存儲的是以字元串的形式序列化的值。如果某個屬性被賦予一個非基本類型的值(如自定義對象),那麼該值會以遞歸方式序列化為JSON.[
JSON與XML
相比XML,JSON更精煉,升培稿更適合JavaScript語言。
應用程序特定的Web服務
在默認情況下, Web服務收發的是SOAP數據包(而不是JSON數據包),通過Web服務描述語言(Web Services Description Language,WSDL)文檔來暴露其協定。AJAX應用程序上下文中的 XML Web服務是如何工作的呢?
可以通過 AJAX應用程序的web.config文件來修改接收asmx請求的HTTP處理程序,將這些調用重定向給能夠理解JSON流的HTTP處理程序。這意味著 XML Web服務可以是一種雙重的服務,即可接受和處理SOAP請求,也可針對JSON請求。在配置層,我們可以禁用SOAP支持,並隱藏用於對外公開該服務功能的WSDL文件。
如果要使用支持JSON的 Web服務,則需要刪除XML,因為在調用 Web服務時,我們不處理SOAP和XML.針對AJAX應用程序的 Web服務不採用SOAP消息。
遠程編程介面的定義
協定(contract)用於定義伺服器端端點暴露給調用者的內容。如果希望以 Web服務的形式實現,則不嚴格要求存在實際的協定。但如果 3.5中的WCF服務,那麼協定就必須存在。總而言之,以介面形式設計的公共API會使代碼更整潔。在實現該介面的類創建完畢後,有關伺服器API介面的工作就結束了。這樣我們就可以發布這個遠程API,並使 AJAX運行庫來管理來自客戶端的調用。
對於 Web服務,我們通過純粹的介面來定義協定,使該介麵包含與伺服器API有關的方法和屬性。下面給出一個簡單的服務:
using System;public interface ITimeService{
DateTime GetTime();
string GetTimeFormat(string format);}
這兩個方法構成了可以在客戶端調用的伺服器API.
實現已約定的介面
Web服務通常通過派生自基類WebService的。NET類來實現:
using System.Web.Services;public class TimeService : WebService, ITimeService{
}
注意,沒有必要一定要從基類WebService派生,這個基類主要用於直接訪問一些常用的對象(如Application和Session)。如果不需要直接訪問這些內部的對象,即使不從WebService類派生也能創建 Web服務。這種情況下,我們可通過HttpContext對象來間接地使用內部的對象。
協定的發布
從本質來說,發布給定的伺服器協定,就是生成一個嵌在頁面中的腳本能夠調用的JavaScript代理類。如果伺服器API通過Web服務實現,我們要向 AJAX頁面的腳本管理器注冊該Web服務。此外,我們還要在web.config文件中添加一個特殊的asmx請求HTTP處理程序。
Web服務的遠程調用
Web服務提供了伺服器端代碼的宿主環境,以便在響應客戶端的操作時進行調用。服務中的Web方法指向應用程序特定的代碼。
AJAX Web服務的創建
為 AJAX應用程序定製的Web服務比其他 Web服務要小。 AJAX Web服務與傳統的 XML Web服務間存在兩方面的差異。
首先,若使用 AJAX Web服務,那麼為滿足特定應用程序的需要,我們要設計 AJAX Web服務的協定,而不是配置公共服務的行為。目標應用程序就是Web服務的宿主。其次,我們必須使用一個新的特性(attribute)來聲明這種Web服務的類,而在常規的 XML Web服務中這是不允許的。
最終的效果是, AJAX Web服務可能有兩套公共介面:一套是基於JSON對介面,由宿主 AJAX應用程序使用;另一套是基於SOAP的介面,暴露給客戶端,任何平台都能訪問該服務的URL.
ScriptService特性(attribute)
為創建 AJAX Web服務,第一步是要建立標準的 Web服務項目,隨後導入System.Web.Script.Services命名空間:
using System.Web.Script.Services;namespace Core35.WebService{
[WebService(Namespace="
[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class TimeService : System.Web.Services.WebService, ITimeService
{

}}
ScriptService特性是使 XML Web服務與 AJAX Web服務間產生差異的關鍵。該特性指出,該服務旨在接受來自基於JavaScript客戶端代理的調用。
阻塞SOAP客戶端
一旦創建AJAX Web服務,便可以ASMX資源的形式發布它。默認情況下,它會有公共的URL,能夠由AJAX客戶端調用,同時也能被SOAP客戶端和工具發現和使用。但我們可禁用SOAP客戶端和工具。為此,只需在web.config文件中添加以下設置:
webSevices
protocols
clear /
/protocols/webServices
這段簡單的設置能禁用 Web服務定義的所有協議(包括SOAP),使該服務只能響應JSON請求。
注意,如果添加這些設置,則不能夠通過瀏覽器的地址欄來調用Web服務,以便進行簡單地測試。類似地,我們也不能為URL添加?wsdl後綴來調用WSDL.
Web服務方法的定義
客戶端頁面能夠調用Web服務類中帶有WebMethod特性的公共方法。在默認情況下,這些方法要通過HTTP動作POST來調用,以JSON對象的形式返回其值。我們可通過一個可選特性ScriptMethod來更改單個方法的默認設置。
ScriptMethod特性帶有3個屬性,見下表:
由於涉及安全性和性能問題,因謹慎使用ScriptMethod特性,下面的代碼使用了該特性,但未修改默認設置:
[WebMethod][ScriptMethod]public DateTime GetTime(){
}
WebMethod特性是必選的,而ScriptMethod特性是可選的。
AJAX Web服務的注冊
為在客戶端發起對 Web服務的調用,我們只需要XMLHttpRequest、目標Web服務的URL和JSON流的管理功能。為方便起見,所有功能都包裝在映射到遠程編程介面的JavaScript代理類中。該代理類會由 AJAX框架自動生成,並注入到客戶端。
為使內建的引擎生成所需的JavaScript代理和輔助類,我們應在需要AJAX Web服務的頁面中,向腳本管理器控制項注冊該Web服務:
asp:ScriptManager ID="ScriptManager1" runat="server"
Services
asp:ServiceReference Path="~/WebServices/TimeService.asmx" /
/Services/asp:ScriptManager
對於每個要綁定到頁面的Web服務,我們添加一個ServiceReference標簽,將Path屬性設為對應asmx資源的URL.對於每個服務引用,都會在客戶端自動生成一個額外的script塊。該腳本的URL指向一個系統HTTP處理程序,在內部調用以下URL:
~/WebServices/TimeService.asmx/js
追加到Web服務URL的/js後綴指示 AJAX運行庫為指定的Web服務生成JavaScript代理類。如果頁面處於調試模板,該後綴會被改為/jsdebug.
默認情況下,JavaScript代理通過script標簽連接到頁面,這樣就需要單獨下載。通過將ServiceReference對象InlineScript屬性設置為true,我們還可以將任何所需的腳本並入當前頁面。如果啟用瀏覽器緩存,且多個Web頁面使用相同的服務引用,那麼默認值false更合適。在這種情況下,不論多少頁面需要這個代理類,都只需執行一次請求。將InlineScript屬性設為true會降低網路請求數,但會多佔用一定的帶寬。
如果以編程方式注冊AJAX Web服務,我們使用類似以下的代碼:
ServiceReference service = new ServiceReference();service.Path = "~/WebServices/TimeService.asmx";ScriptManager1.Services.Add(service);
不論採用哪種方式,為調用Web服務,我們只需通過JavaScript代理類發起調用即可。
使用應用程序來承托AJAX Web服務
為啟用 AJAX應用程序中的Web服務調用,我們需要在web.config文件中添加以下內容以注冊一個特殊的asmx請求HTTP處理程序:
httpHandlers
remove verb="*" path="*.asmx" /
add verb="*" path="*.asmx"
type="System.Web.Script.Services.ScriptHandlerFactory" /
/httpHandlers
該設置已包含在VS2008為支持AJAX的Web項目而創建的web.config文件中。
處理程序工廠(System.Web.Script.Services.ScriptHandlerFactory類)會選擇負責處理給定類型請求的HTTP處理程序,且能通過Web服務調用中的腳本來識別JSON調用。基於JSON的請求由特殊的HTTP處理程序處理,而常規的SOAP調用會穿越管道。
AJAX Web服務的調用
被引用的 AJAX Web服務暴露給JavaScript代碼的類名與伺服器類名相同。代理類採用單例模式,暴露了外界調用的靜態方法,無需實例化。
JavaScript代理類
以上述的timeservice.asmx生成的JavaScript代理類為例,讓我們看看它的代碼:
Type.registerNamespace('Core35.WebServices');Core35.WebServices.TimeService = function(){
Core35.WebServices.TimeService.initializeBase(this);
this._timeout = 0;
this._userContext = null;
this._succceeded = null;
this._failed = null;}Core35.WebServices.TimeService.prototype ={
//調用GetTime方法
GetTime : function(succeededCallback, failedCallback, userContext)
{
//invoke參數分別為:
//Web Service URL路徑
//Web Service方法名稱
//
//傳入方法的參數數組
//執行成功回調函數
//執行失敗回調函數
//調用上下文對象
return this._invoke(Core35.WebServices.TimeService.get_path(),
'GetTime',
false,
{},
succeededCallback,
failedCallback,
userContext);
},
GetTimeFormat : function(timeFormat, succeededCallback, failedCallback, userContext)
{
return this._invoke(Core35.WebServices.TimeService.get_path(),
'GetTimeAsFormat',
false,
{format:timeFormat},
succeededCallback,
failedCallback,
userContext);
}}//注冊Core35.WebServices.TimeService類,該類繼承於.WebServiceProxyCore35.WebServices.TimeService.registerClass('Core35.WebServices.TimeService',
.WebServiceProxy);//創建一個JavaScript代理類實例Core35.WebService.TimeService._staticInstance = new Core35.WebServices.TimeService();
在JavaScript中調用WebService方法其實是通過最後創建的JavaScript代理類實現的:
Core35.WebService.TimeService.GetTime = function(onSuccess, onFailed, userContext){
Core35.WebService.TimeService._staticInstance.GetTime(onSuccess, onFailed, userContext);}Core35.WebService.TimeService.GetTimeFormat = function(onSuccess, onFailed, userContext){
Core35.WebService.TimeService._staticInstance.GetTimeFormat(onSuccess, onFailed, userContext);}
在這個代理類的定義中帶有幾個公共屬性:
path屬性用於定義Web服務的URL,我們可以編程方式更改該屬性值,以便將代理重定向到其他URL.
遠程調用的執行
下面是將JavaScript代理與客戶端按鈕點擊關聯的典型方法:
input type="button" value="Get Time" onclick="getTime()" /
按鈕最好是客戶端按鈕,但也可以是伺服器端Button對象生成的提交按鈕,只要將OnClientClick屬性設置為false的JavaScript代碼即可,這會避免它執行默認的回發操作:
asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="getTime(); return false;" /
getTime函數用於採集必要的輸入數據,並調用代理類中的靜態方法。如果希望為回調或用戶上下文對象賦予默認值,那麼最好在pageLoad函數中進行。因為pageLoad函數會在客戶端頁面 AJAX成功初始化後調用,該函數比瀏覽器的onload事件更可靠。示例代碼如下:
script language="javascript" type="text/javascript"
function pageLoad()
{
//設置默認的調用失敗回調函數
Core35.WebServices.TimeService.set_defaultFailedCallback(methodFailed);
}
function getTime()
{
Core35.WebServices.TimeService.GetTimeFormat("ddd, dd MMMM yyyy [hh:mm:ss]", methodComplete);
}
function methodComplete(results, context, methodName)
{
$get("Label1")。innerHTML = results;
}
function methodFailed(errorInfo, context, methodName)
{
$get("Label1")。innerHTML = String.Format("Execution of method '{0}' failed because of the following:'{1}'",
methodName, errorInfo.get_message());
}/script
由於Web服務調用是以非同步方式處理的,因而我們需要回調來處理調用成功和失敗這兩種情況。這兩個回調的簽名類似:
function method(results, context, methodName)
下表對各參數做了簡要說明:
錯誤處理
failed回調會在伺服器上的遠程方法執行期間發生異常時被調用。在這種情況下,HTTP響應會包含HTTP錯誤碼500(內部錯誤)。
在客戶端,伺服器異常通過JavaScript中的Error對象暴露,該對象會基於從伺服器端獲得的消息和堆棧跟蹤而動態創建。Error對象會通過results參數暴露給failed回調。我們可通過Error對象的message和stackTrace屬性來分別讀取收到的消息和堆棧跟蹤。
如果我們未指派默認的錯誤回調函數, AJAX會調用自己的默認回調函數,該回調函數會彈出一個帶有伺服器異常消息的消息框。
為用戶提供反饋
雖然UpdatePanel中提供了非同步調用的反饋機制(如UpdateProgress控制項),但對於傳統的遠程方法調用,我們只能自行編寫代碼實現對用戶的反饋。
我們可以在遠程方法調用執行前顯示等待消息、GIF動畫或其他內容:
function takeaWhile(){
//顯示等待消息
$get("Feedback")。innerHTML = "Please, wait ";
Core35.WebServices.MySampleService.VeryLengthyTask(methodCompletedWithFeedback, methodFailedWithFeedback);}
在completed回調中,我們首先重置用戶界面,然後再進行其他操作:
function methodCompletedWithFeedback(results, context, methodName){
$get("Feedback")。innerHTML = "";
}
注意,在發生錯誤時,我們也要清除用戶界面。
超時處理
如果發起對asmx Web服務的客戶端調用,則是對asmx的直接調用。對於該請求,運行庫中只有同步處理程序。也就是說,不論客戶端如何檢測當前調用是否正在進行,線程都會被完全阻塞,直到AJAX方法執行完畢。為此,我們可以設置超時時間:
Core35.WebServices.MySampleService.set_timeout(3000);
timeout屬性是全局的,作用於代理類的所有方法。
如果請求超時,我們便不會從伺服器收到響應,客戶端只能單方面的撤銷執行。

⑤ C#, WCF如何創建一個簡單的伺服器端和客戶端程序

首先VS中的模板WCF SERVICE APP 項目,是一個承載到IIS的服務,用過web service就清楚,部署都差不多。

客戶端引用wcf服務,知道url地址就行了,客戶端添加服務引用,和添加以前的web service差不多。
客戶端使用到服務端的數據模型,在服務端定義實體類時,添加 datacontract屬性和datamember屬性就ok.
推薦一些教程地址,可以選擇了看看,你提到的這些問題在教程中都有涉及到。
1,WCF系列學習5天速成 http://www.cnblogs.com/huangxincheng/category/340145.html
2,WCF入門學習【Sheldon_Lou】http://www.cnblogs.com/sheldon-lou/category/648478.html
3,無廢話WCF系列教程 http://www.cnblogs.com/iamlilinfeng/category/415833.html
4,WCF編程 http://www.cnblogs.com/zxj159/category/604460.html
5,WCF入門【停留的風】http://www.cnblogs.com/yank/category/568085.html
6,WCF初探【wangweimutou】http://www.cnblogs.com/wangweimutou/tag/WCF/
7,WCF【指尖流淌】http://www.cnblogs.com/jianliutang/category/277163.html
8,WCF【xfrog】---重點 http://www.cnblogs.com/xfrog/tag/WCF/

閱讀全文

與wcf服務編程pdf下載相關的資料

熱點內容
unix命令rename 瀏覽:864
文件加密了為啥發不出去了 瀏覽:457
單片機調節馬達 瀏覽:743
鏡花pdf 瀏覽:610
廣西民族大學app忘記密碼怎麼辦 瀏覽:374
學生伺服器是什麼意思 瀏覽:533
如何下載快切app 瀏覽:723
如何將電腦c盤文件加密 瀏覽:886
嵌入式為什麼linux 瀏覽:553
c語言編譯器屬於系統軟體 瀏覽:725
android如何斷點調試 瀏覽:722
圖解韓語pdf 瀏覽:302
sas查各文件夾空間大小 瀏覽:454
python腳本檢查埠 瀏覽:960
催眠解壓視頻泡沫 瀏覽:309
雲伺服器部署系統 瀏覽:879
惡意加密別人的文件犯法 瀏覽:833
漢語語法pdf 瀏覽:158
詞法分析編譯原理論文 瀏覽:272
電腦文件夾還原方法 瀏覽:534