1. 程式人生 > >WCF服務開發與呼叫的完整示例

WCF服務開發與呼叫的完整示例

開發工具:VS2008

開發語言:C#

開發內容:簡單的許可權管理系統

第一步、建立WCF服務庫

點選確定,將建立一個WCF 服務庫示例程式,自動生成一個包括IService1.cs和Service1.cs兩個類檔案。我們可以直接對其修改開發我們的服務,但一般直接刪除。

第二步:開發實體類

在解決方案中,新增新類Module.cs

在類中要首先引入using System.Runtime.Serialization名稱空間

實體類具體程式碼如下:

namespace WcfServiceLib.model
{
    /// <summary>
    /// 模組實體
    /// </summary>
    [DataContract]
    class Module
    {
        [DataMember]
        public string ModuleNO;
        [DataMember]
        public string ModuleName;
    }
}

為使在WCF服務被呼叫過程中科被序列化,在實體類前加[DataContract]標籤,實體類每個成員前加[DataMember]標籤

第三步:建立WCF服務介面

WCF服務要對外提供服務,需要建立服務的介面,宣告對外服務的內容。

在解決方案中新增新的介面類imoduleservice.cs,然後引入名門空間using System.ServiceModel;

具體程式碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using WcfServiceLib.model;

namespace WcfServiceLib.iservice
{
    /// <summary>
    /// 介面類
    /// </summary>
    [ServiceContract]
    public interface imoduleservice
    {
        [OperationContract]
        void AddModules(Module book);

        [OperationContract]
        Module GetModuleByID(string id);

        [OperationContract]
        void RemoveModule(string id);

        [OperationContract]
        void ModuleUpdate(Module book);
    }
}

介面類前要加[ServiceContract]標籤,每個成員前要加[OperationContract]標籤,標籤的作用是保證外部呼叫可以訪問到該方法。

第四步:介面類的實現

實現第三步中宣告的介面類,只有這樣WCF服務才會正在提供服務。

在解決方案中新增介面實現類moduleservice,引入名稱空間using System.ServiceModel;

具體程式碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WcfServiceLib.iservice;
using System.ServiceModel;
using WcfServiceLib.model;

namespace WcfServiceLib.service
{
    /// <summary>
    /// 介面類實現
    /// </summary>
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    class moduleservice : imoduleservice
    {
        #region imoduleservice 成員
        List<Module> _Modules = new List<Module>();

        public void AddModules(Module m)
        {
            m.ModuleNO = Guid.NewGuid().ToString();
            _Modules.Add(m);
        }

        public Module GetModuleByID(string id)
        {
            Module m = _Modules.Find(p => p.ModuleNO == id);
            return m;
        }

        public void RemoveModule(string id)
        {
            Module m = _Modules.Find(p => p.ModuleNO == id);
            _Modules.Remove(m);
        }

        public void ModuleUpdate(Module module)
        {
            Module m = _Modules.Find(p => p.ModuleNO == module.ModuleNO);
            m.ModuleName = module.ModuleName;
        }

        #endregion
    }
}

到此為止,WCF服務的主體就開發完成了,那麼如何才可以讓呼叫者使用這個服務呢?我們就需要吧WCF服務註冊併發布一下。

第五步:WCF服務釋出

在VS2008以上的版本中都提供了對WCF服務視覺化註冊和釋出的工具。

出現如下介面:

可以看到有兩個終結點,第一個是服務節點,第二個是元資料節點。由於我們是用VS自帶的服務庫專案來建立的,配置檔案中還沒有刪除這些資訊,所以第一個節點裡還保留著自帶的服務資訊Iservice.下面我們把這個服務更改為我們上文編寫的服務的資訊。

單擊左側的“Services”-“Services.Service1”在右側的Name,彈出“服務型別瀏覽器”對話方塊,在此型別中我們找到此WCF服務專案編譯出來的dll檔案,雙擊它就可以出現此服務中的對外公佈的服務,點選選中它單擊確定。

然後,我們展開左側“Services”->“WcfServiceLib.service.moduleservice”->“Endpoints”,單擊第一個“Empty Name”,從右邊的“EmptyProperties”中的Contract中我們可以看到,這裡的Contract仍然用的是Services.IService1。按照上文的步驟在走一遍,找到DLL後確定。

最後關閉配置視窗,儲存。


到此為止,服務就開發併發布完成了。接下來我們將WCF進行託管後就可以使用了。WCF服務託管有三種方式,最常用的是IIS託管。我們看一下WCF服務是如何進行IIS託管的。

第六步:WCF服務IIS釋出

1、在解決方案上右鍵新增網站,型別選擇WCF服務。

2、建立起來的新的WCF服務站點中在App_Code檔案中自動為我們生成兩個類檔案:IService.cs和Service.cs。這兩個檔案對我們來說沒有用,我們刪掉。

3、然後新增對WCF服務庫專案的引用。結果如下:

4、然後修改Service.svc檔案,程式碼如下:

<%@ ServiceHost Language="C#" Debug="true" Service="WcfServiceLib.service.moduleservice" %>

5、在web.config上右擊選擇“編輯WCF配置”。

關閉WCF編輯工具,儲存即完成了服務的釋出配置。

6、在Service.svc上右擊,選擇“在瀏覽器中檢視”,在IE中執行此服務。

7、在IIS中部署站點,建立虛擬目錄指向該站點。然後瀏覽介面如下。

到此,WCF服務在IIS中託管成功。接下來,我們看一下如何使用WCF服務。

第七步:WCF服務的使用

1、新建Asp.net應用程式

2、右鍵點選“引用”--->新增服務引用

新增成功後,解決方案中檔案如下:

3、後臺呼叫WCF服務,程式碼如下:

   protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ServiceReference1.imoduleserviceClient c = new WCF_Cilent.ServiceReference1.imoduleserviceClient();
                c.AddModules(new WCF_Cilent.ServiceReference1.Module());

                if (c.GetAllModule().Length > 0)
                {
                    Response.Write(c.GetAllModule()[0].ModuleNO.ToString());
                    Response.End();
                }
            }
4、執行程式,出現如下呼叫結果,呼叫成功。