WCF學習之旅——第一個WCF示例(二)

来源:http://www.cnblogs.com/chillsrc/archive/2016/03/14/5275543.html
-Advertisement-
Play Games

我們可以通過代碼和配置文件的方式完成所有的服務寄宿工作。在Hosting項目中的Program.cs文件中的Main方法中,通過代碼實現對 BookService的WCF服務應用的寄宿實現。


第四步:通過自我寄宿的方式寄宿服務

       WCF服務需要依存一個運行著的進程(宿主),服務寄宿就是為服務指定一個宿主的過程。WCF是一個基於消息的通信框架,採用基於終結點(Endpoint)的通信手段。

       終結點主要由地址(Address)、綁定(Binding)和協定(Contract)三要素組成,如圖所示。由於三要素應為首字母分別為ABC,所以就有了易於記憶的公式:Endpoint = ABC。一個終結包含了實現通信所必需的所有信息。如下圖。

終結點三要素  

  • 地址(Address):一個指示可以查找終結點的位置的地址。地址決定了服務的位置,解決了服務定址的問題
  • 綁定(Binding):一個指定客戶端如何與終結點進行通信的綁定。綁定實現了通信的所有細節,包括網路傳輸、消息編碼,以及其他為實現某種功能(比如安全、可靠傳輸、事務等)對消息進行的相應處理。WCF中具有一系列的系統定義綁定,比如BasicHttpBinding、WsHttpBinding、NetTcpBinding等,
  • 協定(Contract):一個標識可用操作的協定。協定是對服務操作的抽象,也是對消息交換模式以及消息結構的定義。
  • 行為(Behavior):一組指定終結點的本地實現細節的行為。

      服務寄宿的目的就是開啟一個進程,為WCF服務應用提供一個運行的環境。通過為服務添加一個或多個終結點,使之暴露給潛在的服務調用者。服務調用者最終通過相匹配的終結點對該服務進行調用。

一)代碼方式實現寄宿

      我們可以通過代碼的方式完成所有的服務寄宿工作。在Hosting項目中的Program.cs文件中的Main方法中,通過代碼實現對 BookService的WCF服務應用的寄宿實現。具體代碼如下:

 using SCF.WcfService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Description;

using System.Text;
using System.Threading.Tasks;

namespace Hosting
{
    class Program
    {
      //  無配置文件的啟動程式

        static void Main(string[] args)

        {
            using (ServiceHost host = new ServiceHost(typeof(BookService)))
            {

                host.AddServiceEndpoint(typeof(IBookService), new WSHttpBinding(),
"http://127.0.0.1:8888/BookService"); if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null) { ServiceMetadataBehavior behavior = new ServiceMetadataBehavior(); behavior.HttpGetEnabled = true; behavior.HttpGetUrl = new Uri("http://127.0.0.1:8888/BookService/metadata"); host.Description.Behaviors.Add(behavior); } host.Opened += delegate { Console.WriteLine("BookService,按任意鍵終止服務!"); }; host.Open(); Console.Read(); } } }

 

        WCF服務寄宿通過一個特殊的對象完成:ServiceHost。在上面的代碼基本實現的功能說明,基於WCF服務應用的類型(typeof(BookService))創建了ServieHost對象,並添加了一個終結點。具體的地址為http://127.0.0.1:8888/BookService,採用了WSHttpBinding,並指定了服務協定的類型IBookService。

        松耦合是SOA的一個基本的特征,WCF服務應用中客戶端和服務端的松耦合體現在客戶端只需要瞭解WCF服務基本的描述,而無需知道具體的實現細節,就可以實現正常的WCF服務調用。WCF服務的描述通過元數據(Metadata)的形式發佈出來。WCF中元數據的發佈通過一個特殊的服務行為ServiceMetadataBehavior實現。在上面提供的服務寄宿代碼中,我們為創建的ServiceHost添加了ServiceMetadataBehavior,並採用了基於HTTP-GET的元數據獲取方式,元數據的發佈地址通過ServiceMetadataBehavior的HttpGetUrl指定。在調用ServiceHost的Open方法對服務成功寄宿後,我們可以通過該地址獲取服務相關的元數據。

 

     3) 運行已經生成的hosting.exe,然後在瀏覽器地址欄上鍵入http://127.0.0.1:8888/BookService/metadata,你將會得到以WSDL形式體現的服務元數據,如下圖所示。

 

 通過HTTP-GET的方式獲取WCF服務的元數據

二)配置文件方式實現寄宿

        在實際應用中,對於WCF應用服務的寄宿,一般不會直接通過編碼的方式進行終結點的添加和服務行為的定義,而是通過寫配置文件的方式實現,這樣可以方便修改。

       1)  現在我在Hosting項目中添加一個app.config配置文件,把下麵的配置信息添加到配置文件app.config中。

 <?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="metadataBehavior">
          <serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:8888/BookService/metadata" />
        </behavior>
      </serviceBehaviors>

    </behaviors> 
    <services>
      <service  behaviorConfiguration="metadataBehavior" name="SCF.WcfService.BookService">
        <endpoint address="http://127.0.0.1:8888/BookService"
            binding="wsHttpBinding" bindingConfiguration="" contract="SCF.WcfService.IBookService" />
      </service>
    </services>
  </system.serviceModel>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
</configuration>

       2)  增加app.config配置文件與配置信息之後,我們原來寫的寄宿代碼就不能使用了,需要進行服務寄宿代碼的修改,而且代碼會變的更簡潔,只需幾行代碼就可以了。代碼如下。

  static void Main(string[] args)
        {
            try
            {
                using (ServiceHost host = new ServiceHost(typeof(BookService)))
                {
                    host.Opened += delegate
                    {
Console.WriteLine(
"BookService,使用配置文件,按任意鍵終止服務!"); }; host.Open(); Console.Read(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } }

      3) 執行hosting.exe應用程式,結果如下圖。


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

-Advertisement-
Play Games
更多相關文章
  • http://cc.bingj.com/cache.aspx?q=OpenEmbedded+clfs&d=4706495287069596&mkt=zh-CN&setlang=zh-CN&w=afp8GvZe7KNcRFBKF2kYXd8WwVn9MVkI CLFS stands for Cross
  • 七、bash腳本中的流程式控制制  條件判斷控制  -[]([]中的表達式是否為真)  &&(前邊的結果是true的時候執行後邊的命令)   ||(前邊的結果是false的時候執行後邊的命令)  -if  -case  迴圈控制  -while  -utile  -for  -break  -conti
  • 張超《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000 我的代碼可見https://www.shiyanlou.com/courses/reports/986221 在這裡我們用的是linux-3.18.6版本,以下簡寫
  • Nginx最大特點: 靜態小文件(1M),支持高併發,同時占用系統資源很少。3W併發,10個進程,記憶體150M。 Nginx特點: 1、配置簡單,靈活,輕量。 2、高併發(靜態小文件),靜態幾萬的併發。 3、占用資源少。2W併發 開10個線程服務,記憶體消耗幾百M。 4、功能種類較多(Web,cach
  • 一、作用 文件/etc/apt/sources.list是一個普通可編輯的文本文件,保存了ubuntu軟體更新的源伺服器的地址。和sources.list功能一樣的是/etc/apt/sources.list.d/*.list(*代表一個文件名,只能由字母、數字、下劃線、英文句號組成)。source
  • Application Request Route(文中簡稱為ARR)是一個寄宿於 IIS7(及以後的IIS 版本)的一個基於代理的模塊,它可以通過判斷 Http Headers,Server Variables 以及負載均衡演算法將 HTTP 的請求轉發到不同的處理伺服器之上。ARR依賴URL Re...
  • 1、C#常量數據類型只能是原始數據類型:int、bool、char、double、string等。 2、C#中用訪問修飾符來說明變數的可訪問性,其值可以是:private、protected、internal、protected internal和public。 public:訪問不受限制,在任意地
  •    眾所周知,如果一個類可以被枚舉,那麼這個類必須要實現IEnumerable介面,而恰恰我們所有的linq都是一個繼承自IEnumerable介面的匿名類, 那麼問題就來了,IEnumerable使了何等神通讓這些集合類型可以被自由的枚舉???   一: 探索IEnumerable 首先我們看看
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...