WCF技術剖析之二十九:換種不同的方式呼叫WCF服務[提供原始碼下載]
我們有兩種典型的WCF呼叫方式:通過SvcUtil.exe(或者新增Web引用)匯入釋出的服務後設資料生成服務代理相關的程式碼和配置;通過ChannelFactory<TChannel>建立服務代理物件。在這篇文章中,我們採用一種獨特的方式進行服務的呼叫。從本質上講,我們只要能夠建立於服務端相匹配的終結點,就能夠實現正常的服務呼叫。在WCF客戶端後設資料架構體系中,利用MetadataExchangeClient可以獲取服務的後設資料,而利用MetadataImporter將獲取的後設資料匯入成ServiceEndpoint物件。在本例中,我們將利用這兩個元件定義了一個獨特的服務呼叫的簡單的例子,相信可以幫助讀者進一步加深對WCF後設資料框架體系的理解。 (Source從這裡下載)
我們依然採用我們熟悉的計算服務的例子,下面是該服務相應的服務契約、服務型別的定義和寄宿該服務採用的配置。
1: using System.ServiceModel;
2: namespace Artech.ServiceInvocationViaMetadata.Contracts
3: {
4: [ServiceContract(Namespace = "http://www.artech.com/")]
5: public interface ICalculator
6: {
7: [OperationContract]
8: double Add(double x, double y);
9: }
10: }
服務型別:
1: using System.ServiceModel;
2: using Artech.ServiceInvocationViaMetadata.Contracts;
3:
4: namespace Artech.ServiceInvocationViaMetadata.Services
5: {
6: public class CalculatorService : ICalculator
7: {
8: public double Add(double x, double y)
9: {
10: return x + y;
11: }
12: }
13: }
配置:
1: <?xml version="1.0" encoding="utf-8" ?>
2: <configuration>
3: <system.serviceModel>
4: <behaviors>
5: <serviceBehaviors>
6: <behavior name="mexBehavior">
7: <serviceMetadata />
8: </behavior>
9: </serviceBehaviors>
10: </behaviors>
11: <services>
12: <service behaviorConfiguration="mexBehavior" name="Artech.ServiceInvocationViaMetadata.Services.CalculatorService">
13: <endpoint address="http://127.0.0.1:3721/calculatorservice" binding="ws2007HttpBinding" contract="Artech.ServiceInvocationViaMetadata.Contracts.ICalculator" />
14: <endpoint address="http://127.0.0.1:3721/calculatorservice/mex" binding="mexHttpBinding" contract="IMetadataExchange" />
15: </service>
16: </services>
17: </system.serviceModel>
18: </configuration>
從上面的配置我們可以看到,服務的後設資料通過WS-MEX模式釋出出來,釋出的地址和採用的MEX繫結分別為:http://127.0.0.1:3721/calculatorservice/mex和mexHttpBinding。
接下來,我們就可以通過下面的方式對該服務進行呼叫了。我們先建立MetadataExchangeClient物件並利用它獲取包含後設資料的MetadataSet物件,並利用該物件建立WsdlImporter物件。接下來,我們將基於ICalculator介面的服務契約新增到該WsdlImporter的已知契約列表中,呼叫ImportAllEndpoints方法得到匯入的ServiceEndpoint列表。最後根據匯出的ServiceEndpoint物件建立ChannelFactory<ICalculator>物件,並建立服務代理進行服務呼叫。
1: sing System;
2: using System.ServiceModel;
3: using System.ServiceModel.Description;
4: using System.Xml;
5: using Artech.ServiceInvocationViaMetadata.Contracts;
6: namespace Artech.ServiceInvocationViaMetadata.Client
7: {
8: class Program
9: {
10: static void Main(string[] args)
11: {
12: MetadataExchangeClient metadataExchangeClient = new MetadataExchangeClient(MetadataExchangeBindings.CreateMexHttpBinding());
13: MetadataSet metadata = metadataExchangeClient.GetMetadata(new EndpointAddress("http://127.0.0.1:3721/calculatorservice/mex"));
14: WsdlImporter wsdlImporter = new WsdlImporter(metadata);
15: //新增已知契約型別
16: ContractDescription contract = ContractDescription.GetContract(typeof(ICalculator));
17: wsdlImporter.KnownContracts.Add(new XmlQualifiedName(contract.Name, contract.Namespace), contract);
18: ServiceEndpointCollection endpoints = wsdlImporter.ImportAllEndpoints();
19: using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>(endpoints[0]))
20: {
21: ICalculator calculator = channelFactory.CreateChannel();
22: using (calculator as IDisposable)
23: {
24: try
25: {
26: Console.WriteLine("x + y = {2} when x = {0} and y = {1}", 1, 2, calculator.Add(1, 2));
27: }
28: catch(TimeoutException)
29: {
30: (calculator as ICommunicationObject).Abort();
31: throw;
32: }
33: catch(CommunicationException)
34: {
35: (calculator as ICommunicationObject).Abort();
36: throw;
37: }
38: }
39: }
40: Console.Read();
41: }
42: }
43: }
微信公眾賬號:大內老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的訊息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。
相關文章
- [WCF許可權控制]通過擴充套件自行實現服務授權[提供原始碼下載]套件原始碼
- WCF服務承載(筆記)筆記
- Java與WCF互動(一):Java客戶端呼叫WCF服務 (轉)Java客戶端
- 用jquery呼叫wcf下的各種錯誤碼的解釋。jQuery
- Silverlight同步(Synchronous)呼叫WCF服務(轉)
- WCF服務端的.NET Core支援專案Core WCF 正式啟動服務端
- nodejs訪問WCF服務NodeJS
- WCF服務程式設計設計規範(7):WCF最佳實踐《WCFBestPractice》資料下載與翻譯程式設計
- 使用多種客戶端消費WCF RestFul服務(一)——服務端客戶端REST服務端
- C# Winform WCF 除錯服務端的程式(三種方法)C#ORM除錯服務端
- 內部通訊服務Factory(WCF)
- WCF基礎教程之開篇:建立、測試和呼叫WCF
- C#定時器中呼叫WCF服務+自定義回撥函式C#定時器函式
- WCF 服務應用程式與 服務庫之間的區別
- 使用多種客戶端消費WCF RestFul服務(四)——Jquery篇客戶端RESTjQuery
- WCF的WindowsService開發參考【附原始碼】Windows原始碼
- [WCF許可權控制]利用WCF自定義授權模式提供當前Principal模式
- C#動態呼叫WCF介面C#
- Silverlight中非同步呼叫WCF服務,傳入回撥函式非同步函式
- WCF技術我們應該如何以正確的方式去學習掌握
- WCF 設計和實現服務協定(01)
- 《WCF全面剖析》-章節內容簡介
- WCF分散式開發步步為贏(13):WCF服務離線操作與訊息佇列MSMQ分散式佇列MQ
- 使用多種客戶端消費WCF RestFul服務(二)——.net4.0篇客戶端REST
- 使用多種客戶端消費WCF RestFul服務(三)——.net4.5篇客戶端REST
- WCF 第一章 基礎 為一個ASMX服務實現一個WCF客戶端ASM客戶端
- [WCF許可權控制]利用WCF自定義授權模式提供當前Principal[原理篇]模式
- WCF技術剖析之十五:資料契約代理(DataContractSurrogate)在序列化中的作用
- WCF服務端丟擲的異常會跑到客戶端服務端客戶端
- MSMQ In WCFMQ
- Dubbo剖析-服務提供方實現類到Invoker的轉換
- wcf 配置與程式碼建立
- SpringCloud元件 & 原始碼剖析:Eureka服務註冊方式流程全面分析SpringGCCloud元件原始碼
- WCF學習筆記(一):WCF簡介筆記
- 如何利用memcached和wcf實現一個快取服務快取
- 深度解析HarmonyOS SDK實況窗服務原始碼,Get不同場景下的多種模板原始碼
- Flask 原始碼剖析——服務啟動篇Flask原始碼
- java使用axis 呼叫WCF webservice問題請教JavaWeb