那天有個小孩教我WCF[一][1/3]


既然是小孩系列,當然要有一點基礎才能快速掌握,歸納,總結的一個系列,哈哈

前言:

第一篇嘛,不細講,步步教你創建一個簡單SOA案例,對WCF有個基本的認識,我不會細講概念

 

 

1.1 SOA簡介

     SOA(Service-Oriented Architecture,面向服務架構),既是一種編程模式,也是軟件開發的一種架構方法。

根據這種架構方法,應用程序就會由“具有一定行為(服務)的功能”單元組成的。<如果你寫過WebService,你就會更好理解了,如果你以前用三層形式寫,那么原來的數據訪問層,你只能供你本程序中的程序調用,假如你用了這種架構,例如,根據一個ISBN查詢到對應書的價格,本來是一個方法,如果你用這個架構,這個方法(行為)就會變成一種服務,這個服務綁定到一個url地址上,然后你根據這個url加個特殊的參數(例如ISBN)就可以返回一個json或者xml,然后你就可以調用了,那么例如你的andriod平板,ipad,只要可以通過url就可以獲得你想要的數據,就可以達到跨平台的效果,跟WebService很像,但是WCF完全不會是那么簡單的>

 

 

1.2 基本開始

 

前言:

     我們准備完成一個簡單的新聞發布系統

     內部編輯發布新聞有更多的功能,但是外部我只提供查看功能,添加自己的新的新聞,但是新聞類型是 好友提供

可能由於我們的新聞系統比較好,我們提供一些接口,讓別人自己做自己的客戶端,也能實現發布新聞,但是我們的源代碼不可能給人家的,所以我們就可以用WCF去做了,再比如,我們想做個iphone應用,別人下載我們的應用也可以查看我們發布的新聞,我們不可能在蘋果手機上去訪問數據庫,我們通過服務去更新數據,中間可以利用WCF實現跨平台,現在我們開始做吧

 

Contract是契約的意思,最常見的,務必背誦 

1.打開Visual Studio 2010,新建一個空白的解決方案

image

命名NewsSystem,點擊確定

然后右擊解決方案,添加4個解決方案文件夾

Clients,Hosts,Services,Interfaces

image

image

 

 

2.右擊Interfaces,添加2個類庫

NewsInterface

NewsExternalInterface

image

添加WCF中最重要的兩個程序集引用

imageimage

同樣的操作對NewsExternalInterface類庫也操作下

 

 

3. 刪除默認添加的兩個Class1.cs文件,分別對應向兩個類庫添加INewsInterface,INewsExternalInterface

image

 

 

4.向兩個接口,都添加下面命名空間引用

using System.Runtime.Serialization;
using System.ServiceModel;

 

5.interface前面加上 public關鍵字

例如:

imageimage

 

 

6.實體類,我們就不分開寫了,直接寫在對應的接口里面吧,這里只是演示WCF的使用,數據庫操作,直接使用linq to sql了,企業里大部分用EF code first,關於這個以后有時間再講。為了不與數據庫的表明沖突,后面加一個Dto了

主要提前領略一下 操作契約,數據契約,枚舉的使用

我們先操作NewsInterface類庫

 

 

6.1新建一個枚舉,NewsTypeEnum,演示枚舉的基本寫法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
 
namespace NewsInterface
{
    [DataContract]
    public enum NewsTypeEnum
    {
        [EnumMember]
        Sports,
        [EnumMember]
        IT,
        [EnumMember]
        Country,
        [EnumMember]
        Funny
    }
}

NewsTypeEnum是一個公開的枚舉類型,注意,enum前必須加上DataContract特性,枚舉類型每個常量都必須使用EnumMember特性來表示

 

 

6.2 添加一個NewsDto實體類, 演示實體的基本寫法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.ServiceModel;
 
namespace NewsInterface
{
    [DataContract]
    public class NewsDto
    {
        /// <summary>
        /// 新聞標題
        /// </summary>
        [DataMember]
        public string NewsTitle { get; set; }
 
        /// <summary>
        /// 新聞內容
        /// </summary>
        [DataMember]
        public string Content { get; set; }
 
        /// <summary>
        /// 新聞類型,這里順便演示下枚舉
        /// </summary>
        [DataMember]
        public NewsTypeEnum NewsType { get; set; }
 
        /// <summary>
        /// 發布時間
        /// </summary>
        [DataMember]
        public DateTime publishTime { get; set; }
 
        /// <summary>
        /// 最后更新時間
        /// </summary>
        [DataMember]
        public DateTime LastUpdateTime { get; set; }
 
        /// <summary>
        /// 作者
        /// </summary>
        [DataMember]
        public string Author { get; set; }
 
        /// <summary>
        /// 最后修改作者
        /// </summary>
        [DataMember]
        public string LastAuthor { get; set; }
 
        /// <summary>
        /// 閱讀量
        /// </summary>
        [DataMember]
        public int ReadCount { get; set; }
    }
}

 

 

 

6.3 打開INewsInterface,添加公開方法,演示 普通的接口,這里在WCF中專業名叫數據契約

我們只演示基本的簡單的更刪改查,還有個顯示新聞關聯圖片5個方法,再次聲明,我不講新聞發布的新聞邏輯,這里只是演示WCF的用法

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.ServiceModel;
 
namespace NewsInterface
{
    [ServiceContract]
    public interface INewsInterface
    {
        /// <summary>
        /// 添加一條新聞
        /// </summary>
        /// <param name="dto">新聞實體</param>
        /// <returns>添加成功后返回添加成功后的ID</returns>
        [OperationContract]
        int NewsAdd(NewsDto dto);
 
        /// <summary>
        /// 刪除一條新聞
        /// </summary>
        /// <param name="dto">新聞實體</param>
        /// <returns>是否刪除成功</returns>
        [OperationContract]
        bool NewsDelete(NewsDto dto);
 
        /// <summary>
        /// 更新一條新聞
        /// </summary>
        /// <param name="dto">新聞實體</param>
        /// <returns>是否更新成功</returns>
        [OperationContract]
        bool NewsUpdate(NewsDto dto);
 
        /// <summary>
        /// 獲得所有新聞
        /// </summary>
        /// <returns>返回新聞列表</returns>
        [OperationContract]
        List<NewsDto> NewsList();
 
        /// <summary>
        /// 根據ID獲得新聞的圖片
        /// </summary>
        /// <param name="Id">新聞編號</param>
        /// <returns>新聞相關聯的圖片</returns>
        [OperationContract]
        byte[] GetNewsImage(string Id);
 
    }
}

 

 

7.創建服務

右擊 Services解決方案文件夾,添加一個類庫,名字叫NewsServices

將Class1.cs文件名改下

修改名字

 

 

7.1 先編譯解決方案,然后 添加引用

         imageimage

 

 

7.2 實現接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.ServiceModel;
using NewsInterface;
 
namespace NewsServices
{
    public class NewsImpl:INewsInterface
    {
 
        public int NewsAdd(NewsDto dto)
        {
            throw new NotImplementedException();
        }
 
        public bool NewsDelete(NewsDto dto)
        {
            throw new NotImplementedException();
        }
 
        public bool NewsUpdate(NewsDto dto)
        {
            throw new NotImplementedException();
        }
 
        public List<NewsDto> NewsList()
        {
            throw new NotImplementedException();
        }
 
        public byte[] GetNewsImage(string Id)
        {
            throw new NotImplementedException();
        }
    }
}

 

 

8. 添加宿主Hosts文件夾下,我們以控制台演示,宿主可以是很多種形式的,具體以后講

image

同時修改屬性 用.NET Framework4

image

然后添加引用

imageimage

打開Program.cs填入一下基本代碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.ServiceModel;
using NewsServices;
 
namespace NewsHosts
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("服務宿主正在打開...");
            try
            {
                //ToDo 等待開啟服務代碼
 
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);                
            }
            Console.WriteLine("打開成功!");
            Console.ReadKey();
        }
    }
}

 

使用ServiceHost對象,添加Program類中

在try…catch代碼塊中添加如下代碼:

image

 

添加宿主服務配置,我們利用WCF工具配置,也可以手動寫

默認生成的App.config右擊它,沒有使用WCF工具配置,我們打開

vs2010菜單欄中的 WCF服務配置編輯器

image

使用之前,請確保你的解決方案重新生成了

image

下面我錄個屏,講一下配置

 這里注意記住終結點這個地址,通過這個地址,我們的其他客戶端,就可以獲得我們想要的數據,我們可以直接把數據發在這個地址上,返回JSON或者XML,或者是.NET對象,然后你繼續處理,如果JSON或者XML,那么WEB就可以使用$.ajax等jQuery的方法獲得數據了,用於顯示在網頁上了

設置啟動項,運行

設置主項目

 

 

先把服務能啟動成功!

 

 代碼下載: 點我下載

 

 

明天2013年6月28日主要講

 

9.創建數據庫

10. 創建服務

11.客戶端使用服務,實現更刪改查,顯示圖片

 

 

 

 

 

時間真的不早了,我要睡覺了。一點一點寫吧

 

晚安,大家!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM