在WCF中獲取服務元資料資訊

2021-09-04 10:24:06 字數 3747 閱讀 3938

所謂獲取wcf的服務元資料(metadata),歸根結點,實際上就是獲取服務的終結點 (endpoint)的資訊,這是服務公開在外的資料資訊,包括address、binding與contract,也就是所謂的abcs。juval löwy在《programming wcf services》一書中,用生動形象的棒棒糖表示了終結點的構成:

wcf服務可能包含多個終結點,每個終結點相當於是通訊的入口,客戶端和服務端通過終結點交換資訊,如下圖所示:

因而,如果能夠獲取終結點的詳細資訊,有助於我們更好地剖析服務的定義、內容與執行方式。

服務有兩種方案可以發布自己的元資料。一種是基於http-get協議提供元資料;另一種則為元資料交換方式,它往往使用乙個專門的終結點,稱之為 元資料交換終結點。元資料交換終結點與其它終結點相似,仍然包含了位址、繫結與契約,但是使用的服務契約為wcf提供的介面 imetadataexchange。

實際上,這兩種發布元資料的方式代表了它使用了兩種不同的標準協議,前者為http/get請求,後者為ws-metadataexchange(mex)。在wcf,以metadataexchangeclientmode列舉型別表示這兩種元資料交換模式:

public

enum metadataexchangeclientmode

wcf為終結點定義了乙個專門的serviceendpoint類,被定義在system.servicemodel.description命名 空間中。serviceendpoint類包含了endpointaddress,binding,contractdescription三個型別的屬 性,分別對應endpoint的address,binding,contract,如下圖:

要獲取服務的終結點,可以通過抽象類metadataimporter獲取,類的定義如下:

public

abstract

class

metadataimporter

在類中,最重要的乙個方法是importallendpoints(),它能夠獲取服務的所有終結點,並返回乙個 serviceendpointcollection型別的物件。該型別為乙個終結點集合,可以通過呼叫 serviceendpointcollection的find()方法或findall()方法,找到符合條件的乙個或多個終結點。它的定義如下:

public

class

serviceendpointcollection : collection

我們可以通過契約型別,或者服務契約的位址,查詢符合條件的終結點。

metadataimporter類只是乙個抽象類,如果要獲取wsdl元資料,還會需要使用繼承它的子型別wsdlimporter:

public

class

wsdlimporter : metadataimporter

如果要使用wsdlimporter,需要為其建構函式傳遞乙個metadataset型別的物件。而metadataset型別的物件則可以通過 metadataexchangeclient類的getmetadata()方法獲得。metadataexchangeclient類的定義如下所 示:

注意,如果是httpget模式,則元資料位址的字尾必須為?wsdl。由於我們在呼叫metadataexchangeclient的 getmetadata()方法時,傳遞的metadataexchangeclientmode列舉引數值為httpget,因此獲取的為基於 http-get的元資料。

如果服務使用的協議為http或者https,則可能使用元資料交換終結點,也可能為http-get模式。此時,我們可以先獲取元資料交換終結點,如果沒有找到,再獲取基於http-get的終結點:

} 在獲得serviceendpointcollection集合物件後,就可以針對每個serviceendpoint獲取終結點的address、binding、contract的資訊,如下所示:

foreach (serviceendpoint endpoint

in endpoints)

」, endpoint.name);

console.writeline(

「address

is」, endpoint.address.uri.absoluteuri);

console.writeline(

「binding

is」, endpoint.binding.gettype().tostring());

console.writeline(

「address

is」, endpoint.contract.name);

console.writeline();

}

在WAS中承載WCF服務

假設iis站點下已有class1.svc檔案和web.config檔案,如下圖 1 在控制面板的 啟用或關閉windows功能 中勾選圖中紅色標記 2 下一步我們需要新增繫結到web站點,如上圖中的ww站點,我們將向ww站點新增tcp協議作為例項,開始 所有程式 附件 右鍵以管理員身份執行命令列工具...

在window元件服務中建立WCF宿主

wcf的宿主host可以存在於四個地方 iis,was,元件服務和window程式中 這個地方說的是元件服務 建立元件服務的host客戶端編碼是沒有變化的,關鍵在於服務端 服務端的的契約介面和契約實現都是一樣的。就是新增了兩個類 這個繼承元件服務基類 public class windowscalc...

在WCF服務中獲取客戶端的IP位址和埠號

using system using system.servicemodel using system.servicemodel.channels namespace wcfservice3 you are from value,endpoint.address,endpoint.port retu...