日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

WinVista新技術(shù) WCF開發(fā)指南之客戶端開發(fā)( 二 )



默認(rèn)地 , SvcUtil還自動生成一個(gè)客戶端配置文件output.config 。你可以使用/config開關(guān)來指定一個(gè)配置文件名:

SvcUtil http://localhost:8002/MyService/MEX/out:Proxy.cs /config:App.Config
并且 , 你可以使用/noconfig開關(guān)來壓縮生成的配置文件:

SvcUtil http://localhost:8002/MyService/MEX/out:Proxy.cs /noconfig
為了支持進(jìn)程內(nèi)宿主 , 應(yīng)用程序配置文件應(yīng)該列出服務(wù)和客戶端節(jié) , 見列表8(見本文相應(yīng)下載源碼) 。注意 , NetNamedPipeBinding被用于進(jìn)程內(nèi)調(diào)用 。

WCF提供一個(gè)能夠編輯宿主和客戶端配置文件的配置文件編輯器SvcConfigEditor.exe(見圖7) 。在寫本文時(shí) , SvcConfigEditor只是生成一些不可讀的配置文件 , 因此 , 在糾正這一問題之前 , 你應(yīng)該手工地編輯這個(gè)文件 。


圖7:SvcConfigEditor用于編輯宿主和客戶端配置文件 。
三. 創(chuàng)建和使用代理

SvcUtil生成的代理類派生自類ClIEntBase<T> , 定義為:


public class ClientBase<T> : IDisposable
{
 protected ClientBase(string endpointConfigurationName);
 protected ClientBase(Binding binding , EndpointAddress remoteAddress);
 public void Close();
 public void Dispose();
 protected T InnerProxy{get;}
 //其它成員
}
這個(gè)InnerProxy屬性是客戶端需要消費(fèi)的合同類型 , 并且SvcUtil生成的ClientBase<T>的子類簡單地把它代理到方法調(diào)用(見列表5) ??蛻舳诵枰獙?shí)例化一個(gè)代理對象并且提供給其構(gòu)造器端點(diǎn)信息-或者是來自配置文件的端點(diǎn)節(jié)名(見列表6)或者是在不使用一個(gè)配置文件時(shí)的端點(diǎn)地址和綁定對象 。然后 , 該客戶端可以使用代理方法來調(diào)用該服務(wù) , 并且客戶端完成后 , 它需要關(guān)閉該代理實(shí)例:

MyContractProxy proxy = new
MyContractProxy("MyEndpoint");
proxy.MyMethod();
proxy.Close();
關(guān)閉代理將終止與服務(wù)的會話并且關(guān)閉連接 。作為選擇 , 你可以使用代理的Dispose()方法來關(guān)閉它 。Dispose()方法的優(yōu)點(diǎn)在于 , 你可以使用using語句來調(diào)用它 , 即使在面臨異常處理時(shí):

using(MyContractProxy proxy = new MyContractProxy("MyEndpoint"))
{
 proxy.MyMethod();
}
在客戶端配置文件中的每個(gè)合同類型的一個(gè)端點(diǎn)可以被指派為一個(gè)默認(rèn)端點(diǎn) 。默認(rèn)端點(diǎn)是一個(gè)沒有名字標(biāo)志或只有一個(gè)空名("")的端點(diǎn)節(jié):

<system.serviceModel>
<client>
<endpoint
...
contract="IMyContract"
/>
<endpoint name="OtherEndpoint"
...
contract="IMyContract"
/>
</client>
</system.serviceModel>
一個(gè)默認(rèn)的端點(diǎn)僅僅是一種理想情況;當(dāng)創(chuàng)建一個(gè)針對默認(rèn)端點(diǎn)的代理時(shí) , 你可以使用代理的默認(rèn)構(gòu)造器來讓它使用默認(rèn)端點(diǎn):

MyContractProxy proxy = new MyContractProxy();
proxy.MyMethod();
proxy.Close();
四. 可編程的客戶端配置

不依賴于配置文件 , 客戶端也可以通過編程方式來構(gòu)建端點(diǎn)并且把它提供給代理構(gòu)造器 。列表9(見本文相應(yīng)下載源碼)展示了這一技術(shù) , 其中展示了等價(jià)于列表6中的代碼(針對列表2中的服務(wù)) 。編程配置是很有用的:當(dāng)端點(diǎn)決策或者是完全動態(tài)的-基于當(dāng)前輸入或在運(yùn)行時(shí)刻使用;或當(dāng)決策是靜態(tài)的且從不更改時(shí) , 你最好采用硬編碼之 。


【W(wǎng)inVista新技術(shù) WCF開發(fā)指南之客戶端開發(fā)】五. WCF架構(gòu)

到目前為止 , 本文討論了建立和消費(fèi)簡單WCF服務(wù)所有要求的內(nèi)容 。然而 , WCF還為可靠性、事務(wù)、安全和實(shí)例激活等提供了極其寶貴的支持 , 所有這些都依賴于WCF基于攔截的架構(gòu) 。

讓客戶端與代理交互意味著 , WCF總是介于服務(wù)和客戶端之間來攔截調(diào)用并且執(zhí)行預(yù)調(diào)用和調(diào)用后處理 。當(dāng)代理把調(diào)用堆棧幀串行化為一條消息并且沿著一個(gè)通道鏈發(fā)送消息時(shí) , 該解釋即開始 。

推薦閱讀