技術交流QQ羣【JAVA,.NET,BigData,AI】:170933152
聲明,找的例子,之前沒有做過wcf,但是看了看例子感覺挺簡單的,記一下吧
WCF的全稱是Windows Communication Foundation,從英文名稱上看,WCF就是基於Windows下一種通訊的基礎架構。利用WCF能夠實現基於Windows下的各種通訊技術的開發以及應用。WCF是面向服務的,它是構建面向服務的系統設計。簡化實現SOA的方法。WCF也是鬆耦合,並沒有限制在特定協議、編碼格式、或者主機環境上。還有WCF所有的選項都是可配置的。WCF也提供了非常好的可交互性,主要體現在兩個方面,一個是支持Web Service的核心標準,另一個是在可擴展性方面能夠快速適用新協議和更新。WCF強調了整合性,整合了Microsoft早期期技術。如COM、Enterprise Services,MSMQ。
本文就介紹下WCF入門以及宿主如何調用WCF服務。在這個例子中我們將使用VS 2012 創建一個WCF服務,其中會了解[DataContract] [ServiceContract] 等的特性以及通過內置的 WCFSVCHost ,並使用“WCF測試客戶端”來測試我們創建的服務。最終在不同的宿主上調用該WCF。
注意下面的所有類、接口及方法都添加了public 的訪問級別。
1、 創建WCF服務庫,如下圖所示
在解決方案中會自動爲我們生成兩個類文件“IService.cs”和“Service.cs”。這兩個類文件是兩個WCF示例文件,對我們開發沒有什麼用處,現在我們刪掉這兩個文件。
2、新建類文件
在彈出的“添加新項”窗口中,選擇“類”,並在“名稱”文本框中寫入項名稱“Person.cs”。
同時也要創建服務接口,聲明對外發布的類和方法,名稱爲“IPersonService.cs”,再創建“PersonService.cs” 如下圖所示:
其中,Person.cs提供所需要的模型。代碼如下:
using System.Runtime.Serialization;
namespace WcfServiceLibrary1
{
[DataContract]
public class Person
{
[DataMember]
public string Id;
[DataMember]
public string Name;
[DataMember]
public int Age;
}
}
IPersonService.cs文件創建服務接口,聲明對外發布的類和方法。代碼如下:
using System.Collections.Generic;
using System.ServiceModel;
namespace WcfServiceLibrary1
{
/// <summary>
/// ServiceContract:服務約定,代表我們所能操作的接口集合,提供功能點。
/// 在IPersonService接口上面,我們定義了[ServiceContract]標籤,此標籤代表此接口及實現此接口的類都是對外發布的Service類,
/// 在每個需要對外發布的方法上都加上[OperationContract]標籤,以使外部可以訪問到此方法。
/// [ServiceContract]和[OperationContract]這兩個標籤需要導入using System.ServiceModel命名空間。
/// </summary>
[ServiceContract]
public interface IPersonService
{
/// <summary>
/// OperationContract 操作約定,定義每個操作的接口點方法。
/// </summary>
[OperationContract]
void AddPerson(Person person);
/// <summary>
/// 獲取所有的實體的方法
/// </summary>
/// <returns></returns>
[OperationContract]
List<Person> GetAllPersons();
/// <summary>
/// 刪除某個實體的方法
/// </summary>
/// <param name="id">實體id</param>
[OperationContract]
void RemovePerson(string id);
}
}
PersonService.cs文件實現我們上面聲明的服務接口,實現對Person的添加、刪除和檢索的具體功能。代碼如下:
using System;
using System.Collections.Generic;
using System.ServiceModel;
namespace WcfServiceLibrary1
{
/// <summary>
/// 此類是對IBookService接口的具體實現,在此類的上面我們聲明瞭[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]標籤,
/// 此標籤代表這個類採用SingleTone(單類模式)來生成對象。
/// 使用[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]接口需要導入using System.ServiceModel;命名空間。
/// </summary>
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class PersonService : IPersonService
{
List<Person> _Persons = new List<Person>();
public void AddPerson(Person person)
{
person.Id = Guid.NewGuid().ToString();
_Persons.Add(person);
}
public List<Person> GetAllPersons()
{
return _Persons;
}
public void RemovePerson(string id)
{
Person person = _Persons.Find(p => p.Id == id);
_Persons.Remove(person);
}
}
}
然後進行編譯。
3、配置服務並運行
到目前爲至,我們建立好了WCF服務,那我們如何讓WCFSVCHost(WCF服務主機)理解我們編寫的服務類,並能夠運行我們編寫的服務呢。這需要我們在App.Config裏面註冊一下我們的WCF服務。
VS爲我們提供了可視化的操作界面。
在項目中右擊“App.Config”配置文件,在彈出的郵件菜單中選擇“編輯WCF配置”,並打開,如下圖所示:
在此界面中暴露兩個對外的終結點(外部可以訪問到的類或接口),其中下面一個是元數據終結點,用來向外提供服務信息的終結點。而另一個(即上面的終結點),是向外公佈我們編寫的[ServiceContract]的類,但我們可以看到它的Contract還是我們在第一步中刪掉的WcfServiceLibrary1.IService1這個終結點。
不僅如此,在右側上面的黑字的服務中還依舊是我們在第一步中刪除的WcfServiceLibrary1.Service1服務。這說明雖然在第一步中我們刪除了那兩個自動生成的類文件,但配置文件中仍沒有刪除這兩個類文件的配置信息。
下面我們把它們改變一下。
單擊左側的“服務”-“WcfServiceLibrary1.Service1”在右側的Name,彈出“服務類型瀏覽器”對話框,在此類型中我們找到此WCF服務項目編譯出來的WcfServiceLibrary1.dll文件,雙擊它就可以出現此服務中的對外公佈的服務,點擊選中它單擊確定。如下圖所示:
這樣我們就可以把對外公司的服務改變爲我們剛編寫的服務了。
然後,我們展開左側“服務”->“WcfServiceLibrary1.PersonService”->“終結點”,單擊第一個“空名稱”,從右邊的“終結點屬性”中的Contract中我們可以看到,這裏的Contract仍然用的是WcfServiceLibrary1.IService1。如下圖所示:
我們按照上面的做法,找到此WCF服務項目編譯出來的WcfServiceLibrary1.dll,雙擊它找到裏面對應的ServiceContract點擊確定就可以了。
重點一定要記着保存,點擊菜單“文件”-“保存”就可以把我們對App.Config的修改保存回配置文件了。
App.Config代碼如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" />
</system.web>
<!-- 部署服務庫項目時,必須將配置文件的內容添加到
主機的 app.config 文件中。System.Configuration 不支持庫的配置文件。-->
<system.serviceModel>
<services>
<service name="WcfServiceLibrary1.PersonService">
<endpoint address="" binding="basicHttpBinding" contract="WcfServiceLibrary1.IPersonService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- 爲避免泄漏元數據信息,
請在部署前將以下值設置爲 false -->
<serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
<!-- 要接收故障異常詳細信息以進行調試,
請將以下值設置爲 true。在部署前設置爲 false
以避免泄漏異常信息-->
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
4、通過WCFSVCHost 來測試WCF服務
在Visual Studio 中爲我們提供了測試WCF的工具,按F5啓動WCF會出現兩個東西:
一個是在右下角的托盤圖標中會出現WCFSVCHost(WCF服務主機),它爲我們在開發時候提供了一個運行WCF的服務器,用來爲測試客戶端提供WCF服務。如下圖所示:
另一個是“WCF測試客戶端”
“測試客戶端”從WcfSVCHost中取得WCF服務的元數據,解析爲左側的“服務結構樹”,從這裏面我們可以看到此WCF服務爲我們提供了一個服務契約“IPersonService”,此服務契約中對外提供了三個可調用的方法。如下圖所示:
然後我們可以通過服務方法來測試。點擊不同的方法進行測試,如下圖所示:
在本例中我們看到,WCF作爲面向對象和麪向服務的橋樑 ,提供了非常方便的工具,無論是開發,配置還是測試,爲我們可以快速的上手並提供面向服務的應用。你可以把WCF類庫當作普通類庫去做,但他提供了更強大的面向服務的特性。
上一遍到現在已經有一段時間了,先向關注本文的各位“挨踢”同仁們道歉了。小生自認爲一個ITer如果想要做的更好,就需要將自己的所學、所用積極分享出來,接收大家的指導和吐槽。網上也有很多WCF相關的教程,但也有很多看完後讓人一種“不知所云”的感覺。小生計劃3月到4月吧WCF系列更新完,希望大家小小支持一下!
言歸正傳,小生在Console Application, Windows Forms Application, Web Application以及ASP.NET MVC中都進行了調用測試,調用方法基本相似,沒有特殊的地方。下面就用WCF作爲服務和其他Project進行結合使用(以VS2012爲例)
1、創建WCF Service Application項目:
命名爲:WcfServiceDemo. 創建後會出現WCF項目
其中:IService1是MS的自帶示例,下面再來添加一個Service class : ServiceDemo.
在ServiceDemo中加一些測試的方法,例如:string TestMethodStr(int i); int TestMethodInt(int i); double TestMethodDou(int i,int j);所示:
IServiceDemo代碼如下:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Runtime.Serialization;
5 using System.ServiceModel;
6 using System.Text;
7
8 namespace WcfServiceDemo
9 {
10 // 注意: 使用“重構”菜單上的“重命名”命令,可以同時更改代碼和配置文件中的接口名“IServiceDemo”。
11 [ServiceContract]
12 public interface IServiceDemo
13 {
14 [OperationContract]
15 String TestMethodStr(int i);
16
17 [OperationContract]
18 Int32 TestMethodInt(int i);
19
20 [OperationContract]
21 Double TestMethodDou(int i, int j);
22 }
23 }
ServiceDemo實現接口,代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace WcfServiceDemo
{
// 注意: 使用“重構”菜單上的“重命名”命令,可以同時更改代碼和配置文件中的類名“ServiceDemo”。
public class ServiceDemo : IServiceDemo
{
public String TestMethodStr(int i)
{
return "param is:" + i;
}
public Int32 TestMethodInt(int i)
{
return i;
}
public Double TestMethodDou(int i, int j)
{
return i / j;
}
}
}
由於代碼都非常簡單,所以就沒有增加註釋了。
再發布之前,可以先利用WCF測試客戶端進行測試:
前面TestMethodStr()和TestMethodInt()得出的值都沒有問題,但是TestMethodDou()得出了0,這是因爲類型轉換的問題。也是正確的。
2、發佈Wcf項目
Rebuild項目,然後public。得到發佈的源碼:
將上面的文件代碼部署到本機IIS中,IIS部署具體方法就不介紹了,如果有什麼問題可留言,打開部署所在地,這邊以我本地的IIS爲例。
部署時,請將應用池改爲如果,瀏覽時,出現權限問題,則需要增加“IIS_IUSERS”和“NETWORK SERVICE”的完全控制權限(可能不都需要,但是我一般都會選擇)
再次運行,則出現證明部署成功!
點擊“WcfServiceDemo.ServiceDemo.svc”,可以看到ServiceDemo服務的信息,如下圖所示:
紅框中的地址就是我們需要調用的地址。
3、創建Condole Application項目:WCFConsole Project(即宿主)
右擊引用,點擊服務引用:
在地址欄處,輸入ServiceDemo服務的svcutil.exe地址,點擊轉到,則會顯示出其對應的WCF接口。這裏命名空間改爲“ServiceReferenceDemo”點擊確定。則可以在引用目錄下看到已經添加的Service References.
在Main函數中,寫入測試代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WCFConsole.ServiceReferenceDemo;
namespace WCFConsole
{
class Program
{
static void Main(string[] args)
{
ServiceDemoClient client = new ServiceDemoClient();
Console.WriteLine(client.TestMethodInt(1));
Console.WriteLine(client.TestMethodStr(1));
Console.WriteLine(client.TestMethodDou(1, 2));
Console.ReadLine();
client.Close();
}
}
}
其中client.Close()寫不寫都可以,服務請求都會有一個週期,過了這個週期就會自動關閉,但最好還是手動進行close()。
執行結果如下:
測試通過。。。
其他裏面調用其實和控制檯應用程序調用完全一致,沒有什麼特別的地方。這節主要是說明如何去調用,在這個例子中其實就是添加了“服務引用”。希望能幫助剛剛接觸的ITer。
4、後話
這節比較簡單,如果有什麼出錯或者不完善的地方,希望大家能夠多多指導小生,小生也會繼續努力!如果各位有疑問或者指教,請留言或者加羣225109172,對MVC、WCF等方面的問題都可以進行學習、交流。