WCF學習之旅—請求與答覆模式和單向模式(十九)

来源:http://www.cnblogs.com/chillsrc/archive/2016/07/26/5707945.html
-Advertisement-
Play Games

客戶端發送請求,然後一直等待服務端的響應(非同步調用除外),期間處於假死狀態,直到服務端有了答覆後,客戶端才會繼續向下執行,這種方式相對單向模式來說靈活性差,但是安全性高,因為是單線程的所以安全性極高,適用於有數據返回的請求。 ...


一、概述

  WCF在通信過程中有三種模式:請求與答覆、單向、雙工通信。以下我們一一介紹。

二、請求與答覆模式

       客戶端發送請求,然後一直等待服務端的響應(非同步調用除外),期間處於假死狀態,直到服務端有了答覆後,客戶端才會繼續向下執行,這種方式相對單向模式來說靈活性差,但是安全性高,因為是單線程的所以安全性極高,適用於有數據返回的請求。如下圖所示(下圖來自網路,圖中的粗紅線在此時代表順序並不代表調用):

 

  請求與答覆模式為WCF的預設模式,如下代碼所示:

       /// <summary>
       /// 請求與答覆模式,預設模式
       /// </summary>
       /// <param name="Id">書籍ID</param>
       /// <returns></returns>
        [OperationContract]
        string GetBook(string Id);

 

  只要是使用特性“[OperationContract]”即使返回值是void 也屬於請求與答覆模式。

  缺點:如果用WCF在程式A中上傳一個2G的文件,那麼要想執行程式B也許就是幾個小時後的事情了。如果操作需要很長的時間,那麼客戶端程式的響應能力將會大大的下降。

  優點:有返回值我們就可以向客戶端返回錯誤信息,如:只接收".rar"文件等信息。

  實例:

 

//服務端介面

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
 

namespace WcfServiceLib
{

    // 註意: 使用“重構”菜單上的“重命名”命令,可以同時更改代碼和配置文件中的介面名“IBookService”。
    [ServiceContract]
    public interface IBookService
    {
       /// <summary>
       /// 請求與答覆模式,預設模式
       /// </summary>
       /// <param name="Id">書籍ID</param>
       /// <returns></returns>

        [OperationContract]
        string GetBook(string Id);    

    }

}

 

 

 //服務端實現
public class BookService : IBookService
    {

  public string GetBook(string Id)
        {

   System.Threading.Thread.Sleep(20000);
            int bookId = Convert.ToInt32(Id);
            Books book = SetBook(bookId);
            string xml = XMLHelper.ToXML<Books>(book);
            return xml;
 

        }

 

        public Books SetBook(int Id)
        {

            Books book = new Books();
            book.BookID = Id;
            book.AuthorID = 1;
            book.Category = "IBM";
            book.Price = 39.99M;
            book.Numberofcopies = 25;
            book.Name = "DB2資料庫性能調整和優";
            book.PublishDate = new DateTime(2015, 2, 23);
            return book;

        }

 }

 

 //客戶端調用

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; 

namespace WinClient
{

    public partial class Form1 : Form
    {

        public Form1()
        {

            InitializeComponent();
        }

 

        private void btnGetBook_Click(object sender, EventArgs e)
        {

          textBox1.Text += string.Format("開始調用wcf服務:{0}\r\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            BookServiceReference.BookServiceClient client = new BookServiceReference.BookServiceClient();
            string book = client.GetBook("5");
            textBox1.Text += book;
            textBox1.Text += string.Format("\r\n調用結束:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

        }

    }

}

 

在上例中,我們在服務端讓線程睡眠20秒然後再返回客戶端,那麼客戶端兩次顯示當前時間的間隔必然在20秒以上,如下圖1,2所示:

 

                                          圖1

 

                                   圖2

 

二、單向模式

         單向模式顧名思義是一種單向的請求,客戶端向服務端發出消息請求後客戶端就和服務端失去了聯繫,請求的一端不會關心是否返回結果繼續往下執行。也就是說客戶端發送請求後就會向下繼續執行,不會等待服務端返回消息,而且服務端接收消息並執行服務,這種單向的模式其實是一種多線程下的操作,客戶端發出消息後, 客戶端和服務端就會同時執行,這樣它們之間就不會互相衝突,同時也是線程安全的,提高了執行效率。
       單向模式只需要在方法聲明中添加IsOneWay屬性即可,它即可表示該消息的調用使用的是單向模式。如下圖所示:

 

  單向模式要在OpertaionContract的屬性中顯示設置值,代碼如下:

   

     [OperationContract(IsOneWay = true)]
         void ShowName(string name);

 

  優缺點與“請求響應模式”差不多倒過來。

  特點:使用 IsOneWay=true 標記的操作不得聲明輸出參數、引用參數或返回值

  實例:

 

  //服務端介面

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
 

namespace WcfServiceLib
{

    // 註意: 使用“重構”菜單上的“重命名”命令,可以同時更改代碼和配置文件中的介面名“IBookService”。
    [ServiceContract]
    public interface IBookService
    {

       /// <summary>
       /// 請求與答覆模式,預設模式
       /// </summary>
       /// <param name="Id">書籍ID</param>
       /// <returns></returns>
        [OperationContract]
        string GetBook(string Id);
        /// <summary>
        /// 單工模式,顯示名稱
        /// </summary>
        /// <param name="name">書籍名稱</param>
        [OperationContract(IsOneWay = true)]
        void ShowName(string name); 

    }
}

 

 //服務端實現

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
 

namespace WcfServiceLib

{

    // 註意: 使用“重構”菜單上的“重命名”命令,可以同時更改代碼、svc 和配置文件中的類名“BookService”。

    // 註意: 為了啟動 WCF 測試客戶端以測試此服務,請在解決方案資源管理器中選擇 BookService.svc 或 BookService.svc.cs,然後開始調試。

    public class BookService : IBookService
    {

        /// <summary>
        /// 請求與答覆模式,預設模式
        /// </summary>
        /// <param name="Id">書籍ID</param>
        /// <returns></returns>
        public string GetBook(string Id)
        {
            System.Threading.Thread.Sleep(20000);
            int bookId = Convert.ToInt32(Id);
            Books book = SetBook(bookId);
            string xml = XMLHelper.ToXML<Books>(book);
            return xml;
        }

 

        public Books SetBook(int Id)
        {
            Books book = new Books();
            book.BookID = Id;
            book.AuthorID = 1;
            book.Category = "IBM";
            book.Price = 39.99M;
            book.Numberofcopies = 25;
            book.Name = "DB2資料庫性能調整和優";
            book.PublishDate = new DateTime(2015, 2, 23);
            return book;
        }

        /// <summary>
        /// 單工模式,顯示名稱
        /// </summary>
        /// <param name="name">名稱</param>
        public void ShowName(string name)
        {
            Console.WriteLine(string.Format("書籍名稱:{0},日期時間{1}", name, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
        }

    }

}

 

 //客戶端調用
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 

namespace WinClient
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

 

        private void btnGetBook_Click(object sender, EventArgs e)
        {

            textBox1.Text += string.Format("開始調用wcf服務:{0}\r\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            BookServiceReference.BookServiceClient client = new BookServiceReference.BookServiceClient();
            string book = client.GetBook("5");
            textBox1.Text += book;
            textBox1.Text += string.Format("\r\n調用結束:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
        }

 

 

        /// <summary>
        /// 單工模式
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonOneWay_Click(object sender, EventArgs e)

        {

            textBox1.Text += string.Format("開始調用wcf服務:{0}\r\n\r\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            BookServiceReference.BookServiceClient client = new BookServiceReference.BookServiceClient();
            client.ShowName("科學可以這樣看叢書");           

            textBox1.Text += string.Format("\r\n\r\n調用結束:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
        }

    }

}

 

  在單向模式中與請求響應模式最主要的就是加IsOneWay屬性,運行效果如下圖:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Visual Studio 支持從一臺電腦到另一臺設備的遠程調試。進行遠程調試時,主機可以是任何支持 Visual Studio 的平臺。遠程設備可以是 x86、x64 或 ARM 平臺。 本文將指導大家如何使用 Visual Studio 對 ASP.NET MVC 項目進行遠程調試。 <! m ...
  • 今天做提示框的時候一直不顯示,讓我鬱悶好久,晚上吃飯的時候問了同事一下,他給了一個思路, 他說可能是因為由於頁面中的無閃刷新導致的結果;百度了一下真找到瞭解決方法 在頁面中存在無閃刷新控制項的時候提示框不能在用普通的,要特殊的處理一下; /// <summary> /// 顯示提示信息(用於頁面中存在 ...
  • 在研究了一個星期的三層架構寫出的一個小功能,使用三層架構並實現點擊新聞標題可以跳轉到自己寫的新聞頁面。 首先是一個DBHelper,這個不是我自己寫的,是朋友給我的 using System; using System.Data; using System.Xml; using System.Dat ...
  • http://www.cnblogs.com/niklai/p/5655061.html ...
  • 我是一年經驗的web程式員,想學習一下wpf,比較喜歡做項目來學習,所以在網上找了一些項目,分析代碼,儘量能夠做到自己重新敲出來 第一個項目是 中間的方塊會不停的旋轉。 第一步,新建wpf項目 第二步,為xaml窗體佈局 下麵是源代碼(不是我寫的) 先給grid設置背景顏色: Background= ...
  • 首先是主頁面main.aspx 然後是左邊頁面Left.aspx 最後是右邊的頁面AddNews.aspx,這個頁面就可以插入自己需要的頁面鏈接了。 以上是我在學習asp的過程中學習到的一個知識點,希望對大家有用。 ...
  • 進程會等待所有的前臺線程完成後在結束工作,但是如果只剩下後臺線程,則會直接結束工作 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading ...
  • Regular Expression Net程式員必然要掌握正則的核心內容:匹配、提取、替換、常用元字元。 正則表達式是用來進行文本處理的技術,是語言無關的,在幾乎所有語言中都有實現。 常用元字元 .:代表除了換行之外的任意字元,一個字元占位。 *:代表前面的子表達式出現0次或者多次。如果需要*代表 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...