WCF系列教程之WCF客戶端調用服務

1、創建WCF客戶端應用程序需要執行下列步驟

(1)、獲取服務終結點的服務協定、綁定以及地址信息

(2)、使用該信息創建WCF客戶端

(3)、調用操作

(4)、關閉WCF客戶端對象

?

二、操作實例

?

1、WCF服務層搭建:新建契約層、服務層、和WCF宿主,添加必須的引用(這里不會的參考本人前面的隨筆),配置宿主,生成解決方案,打開Host.exe,開啟服務。具體的代碼如下:

ICalculate.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;namespace IService
{[ServiceContract]public interface ICalculate{[OperationContract]int Add(int a, int b);}
}

IUserInfo.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;namespace IService
{[ServiceContract]public interface IUserInfo{[OperationContract]User[] GetInfo(int? id);}[DataContract]public class User{[DataMember]public int ID { get; set; }[DataMember]public string Name { get; set; }[DataMember]public int Age { get; set; }[DataMember]public string Nationality { get; set; }  }
}

注:必須引入System.Runtime.Serialization命名空間,應為User類在被傳輸時必須是可序列化的,否則將無法傳輸

Calculate.cs

using IService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Service
{public class Calculate : ICalculate{public int Add(int a, int b){return a + b;}}
}

UserInfo.cs

using IService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Service
{public class UserInfo : IUserInfo{public User[] GetInfo(int? id){List<User> Users = new List<User>();Users.Add(new User { ID = 1, Name = "張三", Age = 11, Nationality = "China" });Users.Add(new User { ID = 2, Name = "李四", Age = 12, Nationality = "English" });Users.Add(new User { ID = 3, Name = "王五", Age = 13, Nationality = "American" });if (id != null){return Users.Where(x => x.ID == id).ToArray();}else{return Users.ToArray();}}}
}

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Service;
using System.ServiceModel;namespace Host
{class Program{static void Main(string[] args){using (ServiceHost host = new ServiceHost(typeof(Calculate))){host.Opened += delegate { Console.WriteLine("服務已經啟動,按任意鍵終止!"); };host.Open();Console.Read();}}}
}

App.Config

<?xml version="1.0"?>
<configuration><system.serviceModel><services><service name="Service.Calculate" behaviorConfiguration="mexBehavior"><host><baseAddresses><add baseAddress="http://localhost:1234/Calculate/"/></baseAddresses></host><endpoint address="" binding="wsHttpBinding" contract="IService.ICalculate" /><endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/></service></services><behaviors><serviceBehaviors><behavior name="mexBehavior"><serviceMetadata httpGetEnabled="true"/><serviceDebug includeExceptionDetailInFaults="true"/></behavior></serviceBehaviors></behaviors></system.serviceModel>
</configuration>

ok,打開Host.exe

服務開啟成功!

2、新建名為Client的客戶端控制臺程序,通過添加引用的方式生成WCF客戶端

確保Host.exe正常開啟的情況下,添加對服務終結點地址http://localhost:6666/UserInfo/的引用,,設置服務命名空間為UserInfoClientNS

點擊確定完成添加,生成客戶端代理類和配置文件代碼后,

開始Client客戶端控制臺程序對WCF服務的調用,Program.cs代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Client.UserInfoClientNS;namespace Client
{class Program{static void Main(string[] args){UserInfoClient proxy =new UserInfoClient();User[] Users = proxy.GetInfo(null);Console.WriteLine("{0,-10}{1,-10}{2,-10}{3,-10}","ID","Name","Age","Nationality");for(int i=0;i<Users.Length;i++){Console.WriteLine("{0,-10}{1,-10}{2,-10}{3,-10}",Users[i].ID.ToString(),Users[i].Name.ToString(),Users[i].Age.ToString(),Users[i].Nationality.ToString());}Console.Read();}}
}

?

ok,第一種客戶端添加引用的方式測試成功

?

3、新建名為Client1的客戶端控制臺程序,通過svcutil.exe工具生成客戶端代理類的方式生成WCF客戶端,在VS2012 開發人員命令提示中輸入以下命令:

(1)、定位到當前客戶端所在的盤符

(2)、定位當前客戶端所在的路徑

?

(3)、svcutil?http://localhost:8000/OneWay/?wsdl?/o:OneWay.cs ? ? ?這里是OneWay,你本地是什么就是什么

(4)、生成客戶端代理類,生成成功之后,將文件添加到項目中

ok,生成成功!

(5)、將生成的文件包括到項目中,引入System.Runtime.Serialization命名空間和System.ServiceModel命名空間

(6)、確保服務開啟的情況下,開始調用,Program.cs代碼如下:

UserInfoClient proxy = new UserInfoClient();User[] Users = proxy.GetInfo(null);Console.WriteLine("{0,-10}{1,-10}{2,-10}{3,-10}", "ID", "Name", "Age", "Nationality");for (int i = 0; i < Users.Length; i++){Console.WriteLine("{0,-10}{1,-10}{2,-10}{3,-10}",Users[i].ID.ToString(),Users[i].Name.ToString(),Users[i].Age.ToString(),Users[i].Nationality.ToString());}Console.Read();

ok,服務調用成功,說明使用svcutil工具生成WCF客戶端的方式可行。

?

4、通過添加對Service程序集的引用,完成對WCF服務端的調用,新建一個Client2客戶端控制臺程序

先添加下面三個引用

using IService;
using System.ServiceModel;
using System.ServiceModel.Channels;

(1)、Program.cs代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using IService;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Text;
using System.Threading.Tasks;namespace Client2
{class Program{static void Main(string[] args){EndpointAddress address = new EndpointAddress("http://localhost:6666/UserInfo/");WSHttpBinding binding = new WSHttpBinding();ChannelFactory<IUserInfo> factory = new ChannelFactory<IUserInfo>(binding, address);IUserInfo channel = factory.CreateChannel();User[] Users = channel.GetInfo(null);Console.WriteLine("{0,-10}{1,-10}{2,-10}{3,-10}", "ID", "Name", "Age", "Nationality");for (int i = 0; i < Users.Length; i++){Console.WriteLine("{0,-10}{1,-10}{2,-10}{3,-10}",Users[i].ID.ToString(),Users[i].Name.ToString(),Users[i].Age.ToString(),Users[i].Nationality.ToString());}((IChannel)channel).Close();factory.Close();Console.Read();}}
}

ok,調用成功!

?

三、歸納總結

通過上面的代碼判斷WCF客戶端調用服務存在以下特點:

1、WCF服務端可客戶端通過使用托管屬性、接口、方法對協定進行建模。若要連接到服務端的服務,則需要獲取該服務協定的類型信息.獲取協定的類型信息有兩種方式:

(1)、通過Svcutil工具,在客戶端生成代理類的方式,來獲取服務端服務的服務協定的類型信息

(2)、通過給項目添加服務引用的方式

上面兩種方式都會從服務端的服務中下載元數據,并使用當前你使用的語言,將其轉換成托管源代碼文件中,同時還創建一個您可用于配置 WCF 客戶端對象的客戶端應用程序配置文件.

2、WCF客戶端是表示某個WCF服務的本地對象,客戶端可以通過該本地對象與遠程服務進行通信。因此當你在服務端創建了一個服務端協定,并對其進行配置后,客戶端就可以通過生成代理類的方式(具體生成代理類的方式,上面已經提了)和服務端的服務進行通信,WCF 運行時將方法調用轉換為消息,然后將這些消息發送到服務,偵聽回復,并將這些值作為返回值或 out 參數(或 ref 參數)返回到 WCF 客戶端對象中.(有待考證);

3、創建并配置了客戶端對象后,請創建一個 try/catch 塊,如果該對象是本地對象,則以相同的方式調用操作,然后關閉 WCF 客戶端對象。 當客戶端應用程序調用第一個操作時,WCF 將自動打開基礎通道,并在回收對象時關閉基礎通道。 (或者,還可以在調用其他操作之前或之后顯式打開和關閉該通道。)。不應該使用 using 塊來調用WCF服務方法。因為C# 的“using”語句會導致調用 Dispose()。 它等效于 Close(),當發生網絡錯誤時可能會引發異常。 由于對 Dispose() 的調用是在“using”塊的右大括號處隱式發生的,因此導致異常的根源往往會被編寫代碼和閱讀代碼的人所忽略。 這是應用程序錯誤的潛在根源

?

轉載于:https://www.cnblogs.com/GreenLeaves/p/6859012.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254591.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254591.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254591.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《高效程序員的45個習慣》-之三

請您在閱讀本文之前&#xff0c;先了解《高效程序員的45個習慣》-之二。 每一期都會涉及15個話題&#xff0c;用3期來列出這45個習慣&#xff0c;每次不貪多&#xff0c;貪精&#xff0c;大家如果有空&#xff0c;一定要細細品味這15個習慣。 注意&#xff1a;每一個好的習…

負載均衡的那些事?

什么是負載均衡&#xff1f;1、負載&#xff1a;就是后端系統的承載能力。比如同等條件下&#xff0c;一個1核cpu-1G內存的機器的承載能力一般會比8核cpu-8G內存的機器要差&#xff1b;相同配置下&#xff0c;一個cpu利用率為80%的機器比30%的承載能力一般要差等等。2、均衡&am…

Develop內部函數,持續更新

Develop內部函數 目錄Develop內部函數dev_clear_objdev_clear_windowdev_close_inspect_ctrldev_close_tooldev_close_windowdev_disp_textdev_displaydev_error_vardev_get_exception_datadev_get_preferencesdev_get_systemdev_get_windowdev_inspect_ctrldev_map_pardev_map…

短信認證方案,用手機短信進行上網認證如何實現?

WFilter NGF的“Web認證”模塊&#xff0c;提供了一系列的上網認證解決方案。包括如下認證方式&#xff1a;本地用戶名密碼認證AD域用戶名密碼認證企業郵箱用戶名密碼認證Radius用戶名密碼認證微信WiFi認證Facebook Wifi認證除此&#xff0c;WFilter NGF還有一個“其他”的選項…

《高效程序員的45個習慣》-末篇

請您在閱讀本文之前&#xff0c;先了解《高效程序員的45個習慣》-之三。 每一期都會涉及15個話題&#xff0c;用3期來列出這45個習慣&#xff0c;每次不貪多&#xff0c;貪精&#xff0c;大家如果有空&#xff0c;一定要細細品味這15個習慣。 注意&#xff1a;每一個好的習…

【Qt開發】V4L2 API詳解 Buffer的準備和數據讀取

前面主要介紹的是&#xff1a;V4L2 的一些設置接口&#xff0c;如亮度&#xff0c;飽和度&#xff0c;曝光時間&#xff0c;幀數&#xff0c;增益&#xff0c;白平衡等。今天看看V4L2 得到數據的幾個關鍵ioctl&#xff0c;Buffer的申請和數據的抓取。1. 初始化 Memory Mapping …

halcon File文件算子,持續更新

目錄File文件Images圖像read_imageread_sequencewrite_imagedeserialize_imageserialize_imagelist_image_fileparse_filenameMisc混合體copy_filedelete_filefile_existsget_current_dirlist_filesmake_dirread_world_fileremove_dirset_current_dirObject對象deserialize_obj…

Nginx 之一:編譯安裝nginx 1.8.1 及配置

轉http://www.cnblogs.com/zhang-shijie/p/5294162.html 一&#xff1a;基介紹 官網地址www.nginx.org&#xff0c;nginx是由1994年畢業于俄羅斯國立莫斯科鮑曼科技大學的同學為俄羅斯rambler.ru公司開發的&#xff0c;開發工作最早從2002年開始&#xff0c;第一次公開發布時間…

PI校正環節的程序實現推導過程

PI校正環節在經典控制論中非常有用&#xff0c;特別是對負反饋控制系統&#xff0c;基本上都有PI校正環節。1.下面分別說明比例環節和積分環節的作用&#xff0c;以階躍信號為例。①比例環節單獨作用以上分析說明&#xff0c;若只有比例環節的控制系統&#xff0c;階躍響應也是…

XML文檔注釋(C#)

目錄XML文檔編譯器識別的標記添加XLM注釋的方法添加XLM注釋的例子XML文檔 C#可以根據特定的注釋自動創建XML格式的文檔說明。 這些注釋都是單行注釋&#xff0c;但都以三條斜杠開頭 編譯器識別的標記 標記說明<C>把行中的文本標記為代碼&#xff0c;例如<c>int …

vs里根據json快速創建對應類的方法

有時候,我們在調用別人接口的時候,服務端返回了一個json格式的字符串,我們要獲取json里面的數據的話一般有兩種方式: 1.通過正則 2.反序列化成一個對象 第一種方式這里不再多說,主要說一下第二種,(為什么呢&#xff0c;你看到后面 你也會喜歡上第二種) 有人肯定會說, json字符串…

德魯克的《卓有成效的管理者》

是一本很好的書&#xff0c;對我有諸多的啟發&#xff0c;這本書我在短期內連看兩遍呢。 現將一些我覺得有啟發性的句子發給大家分享。 1. 一個人的有效性&#xff0c;與他的智力、想象力或知識之間&#xff0c;幾乎沒有太大的關聯。有才能的人往往最為無效&#xff0c;因為他們…

人工智能之基于face_recognition的人臉檢測與識別

不久乘高鐵出行&#xff0c;看見高鐵火車站已經實現了“刷臉進站”&#xff0c;而且效率很高&#xff0c;很感興趣&#xff0c;今天抽時間研究一下&#xff0c;其實沒那么復雜。 我基本上是基于https://github.com/ageitgey/face_recognition上的資料和源碼做一些嘗試和試驗。 …

iOS 升級https的方案選擇

我的選擇是將UIWebView統一替換為WKWebView WKWebView AFN SDWebImage https的支持之前的博客都有涉及轉載于:https://www.cnblogs.com/Jusive/p/6867531.html

預處理指令(C#)

目錄預處理指令簡介#define、#undef#if、#elif、#else、#endif#warning、#error#region、#endregion#line、#line default#pragma預處理指令簡介 微軟對預處理指令解釋鏈接 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/preprocessor-directives/index…

NSWindowController的初始化創建代碼

-(PRAboutWindowController*)aboutCtrl{ if(_aboutCtrl nil){ _aboutCtrl [[PRAboutWindowController alloc]initWithWindowNibName:"PRAboutWindowController"]; } return _aboutCtrl ; } 轉載于:https://www.cnblogs.com/PJXWang/p/5816675.html

對CMMI3的學習和思考

原文出處&#xff1a; http://tech.it168.com/m/2007-08-02/200708020957750.shtml本文請勿轉載。近來筆者所在公司正在為過CMMI3做各種準備&#xff0c;對公司的員工進行了一些相關的培訓&#xff0c;作為項目管理人員的我&#xff0c;在學習CMMI3的過程中&#xff0c;也有了自…

Python3抓取糗百、不得姐

?點擊關注 異步圖書&#xff0c;置頂公眾號 每天與你分享 IT好書 技術干貨 職場知識 重要提示1:本文所列程序均基于Python3.6,低于Python3.6的Python版本可能無法運行.重要提示2:因所抓取的網站可能隨時更改展示內容,因此程序也需及時跟進.重要提示3:本程序僅供學習,不能拿去做…

halcon邊緣檢測的方法及各種方法的適用范圍

目錄一、邊緣提取二、BLOB分析檢測三、贓物檢測一、邊緣提取 1、設置ROI興趣區域 2、快速二值化&#xff0c;并連接相鄰區域。 這樣做的目的是進一步減少目標區域&#xff0c;通過二值化將目標區域大概輪廓提取出來 3、提取最接近目標區域的輪廓 常用函數有boundary&#xff0…

Oracle優化-表設計

前言  絕大多數的Oracle數據庫性能問題都是由于數據庫設計不合理造成的&#xff0c;只有少部分問題根植于Database Buffer、Share Pool、Redo Log Buffer等內存模塊配置不合理&#xff0c;I/O爭用&#xff0c;CPU爭用等DBA職責范圍上。所以除非是面對一個業已完成不可變更的系…