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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...