WCF WCF的宿主

来源:http://www.cnblogs.com/Liyuting/archive/2017/12/05/7986735.html
-Advertisement-
Play Games

一、WCF服務應用程式與WCF服務庫 我們在平時開發的過程中常用的項目類型有“WCF 服務應用程式”和“WCF服務庫”。 WCF服務應用程式,是一個可以執行的程式,它有獨立的進程,WCF服務類契約的定義,可以直接看到運行的效果。此項目模板基於IIS托管的程式,如本系列的第一節所示。在開發基於IIS托 ...


一、WCF服務應用程式與WCF服務庫

  我們在平時開發的過程中常用的項目類型有“WCF 服務應用程式”和“WCF服務庫”。

  WCF服務應用程式,是一個可以執行的程式,它有獨立的進程,WCF服務類契約的定義,可以直接看到運行的效果。此項目模板基於IIS托管的程式,如本系列的第一節所示。在開發基於IIS托管的WCF服務程式時,比較多見,自學的時候也可以使用這種類型,簡單易懂。

  WCF服務庫,可以認為是一個包含WCF服務以及契約定義的類庫。不能直接運行,你可以在其他項目里引用,在宿主里啟用托管這個庫,有點類似於我們在Web項目中應用的類庫。考慮WCF服務設計的時候,服務類的定義為單獨的庫,可以為其它項目使用。提高代碼的復用性。

  當然你也可以修改這些代碼,比如把WCF服務程式里的類,移到一個單獨的類庫里,或是把類庫里的類移到WCF服務程式中。

二、概述

  通過前面的介紹我們知道,WCF在運行時必寄宿在“宿主程式”之上,WCF本身不能夠獨自運行(每個WCF服務必須宿主在一個Windows進程中)。.net 提供了多種宿主供WCF運行,WCF還是非常靈活的。

  WCF的宿主可以是 Windows 服務、COM+應用程式、WAS(Windows Activation Services,Windows進程激活服務)或IIS、Windows應用程式,或簡單的控制台應用程式及任何.net程式。

  這節的示例我們重新建立WCF類庫項目為例做示例,名稱為:WCFLibrary,並刪除自動生成的兩個文件(IService1.cs、Service1.cs)。如下圖所示:

  滑鼠右鍵查看項目屬性。我們發現,其實“WCF類庫項目”與我們平時建立的“類庫項目”都是類庫,只不過多了WCF的類庫項目在新建時多了兩個dll的引用(System.ServiceModel.dll、System.Runtime.Serialization.dll)和一個自動生成的配置文件(該配置文件只用於調試時使用,在WCF寄宿以後會應用宿主的配置文件與其他應用程式通信)。這更說明瞭我們在做分式程式開發的時候與我們平時開發的應用程式沒有多大的區別,只要我們在應用程式間通信時“符合WCF的約定”即可。

  服務端我們還和第一個教程一樣(IUser介面與User實現),只建立一個方法做為我們調用的示例代碼如下:

//添加引用
using System.ServiceModel;

namespace WCFLibrary
{
    [ServiceContract]
    interface IUser
    {
        [OperationContract]
        string ShowName(string name);
    }
}

namespace WCFLibrary
{
    class User : IUser
    {
        public string ShowName(string name)
        {
            string wcfName = string.Format("WCF服務,顯示姓名:{0}", name);
            return wcfName;
        }
    }
}

由於原來的契約為IService,現在的為IUser,所以配置文件有兩處要修改為:

<service name="WCFLibrary.User">

<endpoint address="" binding="wsHttpBinding" contract="WCFLibrary.IUser">

點擊“F5“運行效果如下圖所示說明成功:

二、IIS宿主

  我們在第一節中,把WCF寄宿在IIS之上,在IIS中宿主一個服務的主要優點是在發生客戶端請求時宿主進程會被自動啟動,並且你可以依靠IIS來管理宿主進程的生命周期。在開發和使用的過程與Web Service非常相似。

、控制台應用程式宿主

  建立宿主

  (1)在解決方案下新建控制台輸出項目 WCFHost_Console。

  (2)添加 System.ServiceModel.dll 的引用。

  (3)添加 WCF 服務類庫(WCFLibrary)的項目引用。

  (4)創建宿主程式,代碼如下:

using System;
using WCFLibrary;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace WCFHost_Console
{
    class Program
    {
        static void Main(string[] args)
        {
            //創建宿主的基地址
            Uri baseAddress = new Uri("http://localhost:8080/User");
            //創建宿主
            using (ServiceHost host = new ServiceHost(typeof(User), baseAddress))
            {
                //向宿主中添加終結點
                host.AddServiceEndpoint(typeof(IUser), new WSHttpBinding(), "");
                //將HttpGetEnabled屬性設置為true
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                //將行為添加到Behaviors中
                host.Description.Behaviors.Add(smb);
                //打開宿主
                host.Open();
                Console.WriteLine("WCF中的HTTP監聽已啟動....");
                Console.ReadLine();
                host.Close();
            }
        }
    }
}

(5)運行宿主程式[在客戶端調用時要先運行宿主程式],如下圖所示:

  說明宿主建立成功。在上例中用到"ServiceHost"類,這裡只是簡單的應用,具體請查看"MSDN ServiceHost"

  建立客戶端

  (1)重新建立解決方案-->Web應用程式項目。

  (2)添加對服務的引用(在引用上右鍵-->輸入我們定義的服務宿主的基地址(此處為:http://localhost:8080/User)-->前往-->確定),具體請看第一節。

  (3)測試程式如下圖所示說明成功(註意:一定要先運行我們的宿主程式才行,如果宿主沒有打開的話會報錯:由於目標電腦積極拒絕,無法連接。)。

  在這個示例中我們把Endpoint中的ABC,基地址,Behaviors等都直接寫在了代碼里,但實際應用過程中都是去依賴配置文件,為了對比說明我們下麵的例子中會使用配置文件。

四、Windows應用程式宿主 

  建立宿主

  (1)在解決方案下新建Windows窗體應用程式項目 WCFHost_Form。

  (2)添加 System.ServiceModel.dll 的引用。

  (3)添加 WCF 服務類庫(WCFLibrary)的項目引用。

  (4)添加應用程式配置文件App.config。

  (5)創建宿主程式MainForm窗體,並修改App.config,代碼如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="WCFLibrary.User">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8081/User"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" contract="WCFLibrary.IUser"></endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>


using System;
using WCFLibrary;
using System.ServiceModel;
using System.Windows.Forms;
using System.Configuration;

namespace WCFHost_Form
{
    public partial class MainForm : Form
    {
        ServiceHost host;

        public MainForm()
        {
            InitializeComponent();
        }

        //應用程式載入
        private void MainForm_Load(object sender, EventArgs e)
        {
            host = new ServiceHost(typeof(User));
            //打開宿主
            host.Open();
            this.lblState.Text = "WCF中的HTTP監聽已啟動....";
        }

        //應用程式關閉
        private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            host.Close();
        }
    }
}

運行程式如下圖所示:

  建立客戶端

  同上邊的Console程式一樣,這裡要引用的地址為:<add baseAddress="http://localhost:8081/User"/>

  在這個例子中與Console應用程式不同的是,我們在Console配置是直接寫在程式中的,而在本例中我們應用的是配置文件,區別在於如果寫在配置文件中程式運行時直接到配置文件里取出相關的配置節去創建ServiceHost類。

五、WAS宿主

  Windows 進程激活服務 (WAS) 概述  

  IIS7允許通過HTTP外的協議進行激活和網路通信。此環境適合開發可通過WCF支持的任何網路協議(包括http、net.tcp、net.pipe、net.msmq)進行通信的WCF服務。部署簡單、管理方便,這些網路協議在部署時可像Http一樣,直接丟到IIS7上即可,我們在下麵的例子中以net.tcp為協議為例。IIS7以下的版本只能支持Http的通信。

  1、確保已安裝IIS7的激活組件

  在應用WAS宿主時,必須確保IIS7的激活組件安裝好。打開“控制面板”-->“打開或關閉Windows功能”-->“功能”,我的機器上已經安裝過,如下圖所示(WCF激活與非WCF激活):

  如果沒有安裝,點擊“添加新功能”,然後勾選“WCF激活”,如下圖所示:

  安裝成功後我們打開IIS,點擊“預設網站(任一個網站即可)”-->“綁定”-->“添加”,在類型中會出現非IIS支持的其他類型。如下圖所示

  說明安裝成功。

  2、添加net.tcp的網站綁定

  在上圖中,我們選擇類型net.tcp,然後在綁定信息中填寫“808:*”,點擊確定。

  3、開通net.tcp的協議 

  在安裝成功並且在指定的網站上綁定了net.tcp以後,我們還要開通.net.tcp協議,點擊我們要部署WCF的網站,在IIS管理器的操作功能區有一項“高級設置”點擊後出現如下圖所示高級配置的窗體

  在啟用的協議中添加net.tcp協議(原來只對http協議支持,現在把tcp協議追加上去),中間用逗號隔離開,如上圖所示。

  註意:這幾個步驟一個也不能少,否則會出現:“找不到具有綁定 NetTcpBinding 的終結點的與方案 net.tcp 匹配的基址。註冊的基址方案是 [http]”的錯誤信息。

   4、建立服務程式

  (1)在解決方案下新建WCF服務應用程式項目 WCFHost_WAS。

  (2)建立IUser與User,代碼同例二一樣。

  (3)修改配置文件代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="netTcpBindConfig">
          <security mode="None">
            <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
            <message clientCredentialType="Windows" />
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="MyBehavior" name="WCFHost_WAS.User">
        <endpoint address="" binding="netTcpBinding" contract="WCFHost_WAS.IUser" bindingConfiguration="netTcpBindConfig"></endpoint>
        <!--元數據交換的終結點-->
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" ></endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyBehavior" >
          <serviceMetadata/>
          <serviceDebug includeExceptionDetailInFaults="true" />
          <dataContractSerializer maxItemsInObjectGraph="6553600"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>

(5)部署服務

  像其他的Web應用程式一樣,把相關的文件丟到伺服器端指定目錄即可。

  滑鼠右鍵瀏覽User.svc,如現如下所示:

  說明部署成功,如上所示的服務地址為:net.tcp://伺服器名/User.svc/mex

  (6)建立客戶端

  建立客戶端也與其他的一樣,如下圖所示:

  我們此時看客戶端的配置文件:

<client>
      <endpoint address="http://localhost:8080/User" binding="wsHttpBinding"
        contract="WCFHost_Console.IUser" />
      <endpoint address="http://localhost:8081/User" binding="wsHttpBinding"
        bindingConfiguration="WSHttpBinding_IUser" contract="WCFHost_Form.IUser"
        name="WSHttpBinding_IUser">
        <identity>
          <userPrincipalName value="WIN-EOUTAA4CP4O\Administrator" />
        </identity>
      </endpoint>
      <endpoint address="net.tcp://win-eoutaa4cp4o/User.svc" binding="netTcpBinding"
        bindingConfiguration="NetTcpBinding_IUser" contract="WCFHost_WAS.IUser"
        name="NetTcpBinding_IUser" />
    </client>

我們在一個Web應用程式中調用了三種不同宿主的服務。 

七、總結

  通過上面的幾個例子,我們實現了控制台宿主、Form宿主、WAS宿主(基於TCP協議)的實現。在實際的開發過程中,有時候我們還會用到基於Windows服務的宿主,但大部份都使用IIS做宿主,方便、快捷。

 

原文鏈接:http://www.cnblogs.com/iamlilinfeng/archive/2012/10/01/2706353.html


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

-Advertisement-
Play Games
更多相關文章
  • 最近要做個winform的東西,要在裡面集成一個類似Windows自帶畫圖的標尺功能,還要能在圖片上畫矩形框。在網上找了好久也沒找到寫好的控制項,無奈自己做了一個。 目前還有些bug,這裡先做個分享。(Ps:很少做winform的東西,做的不好,輕噴。另外歡迎指點。) 由於最後要做的東西的背景是黑的, ...
  • 東西不是很複雜,不過百度出來的,貌似都是一種,代碼太長了,複製都不想複製,來個簡易版本的吧,直接貼代碼。 ...
  • 本節將分析 代碼。 源代碼參考.NET Core 2.0.0 "WebHostBuilder" "WebHost" "Kestrel" 問題概要 1. Hosting中有哪2個ServiceProvider,各自如何創建,以及有哪些ServiceCollection。 1. 什麼時候執行Startu ...
  • Markdown是一種可以使用普通文本編輯器編寫的標記語言,通過簡單的標記語法,它可以使普通文本內容具有一定的格式。 ...
  • Dapper介紹 Dapper是.Net下的一個輕量級ORM框架.在小型工具向的項目下,使用Dapper會使資料庫操作層代碼更加優雅. Dapper的使用 在項目中使用引用Dapper非常簡單,你可以選擇兩種方式: 1.在NuGet引用 2.Github下載源代碼,添加到項目當中去 Dapper 項 ...
  • 開發C#的程式,寫到屬性property時,我們可以在Set方法中做一些簡單的規則驗證:如下麵,Insus.NET寫一個Age屬性,只允許用戶輸入10以內的數字: class AA { private int _Age; public int Age { get { return _Age; } s ...
  • 本著開發與實施分離的思想,設計一個通用的報表設計窗體顯得尤為重要(下圖為圖一): 要求與優點: I、報表設計窗體支持所有單據調用,一種單據支持多個列印模板。 II、報表模板存儲在資料庫中。一是支持客戶端設計及保存模板,二是一次修改所有客戶端生效。 III、點擊保存是將模板保存在資料庫中,點擊另存為可 ...
  • 周日外出去玩,出行方式有步行,騎行,公車。每個人因人或環境等等因素而選擇的方式有所不同。簡單工廠是符合此類型的。只有在運行時,才知道使用的哪種方法。創建一個抽象類Base: public abstract class Base { public abstract string Mode(); } 下 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...