WCF學習之旅—WCF服務配置(十四)

来源:http://www.cnblogs.com/chillsrc/archive/2016/06/21/5603565.html
-Advertisement-
Play Games

我們在前面章節中講了寄宿,在前面的實例中也用到了配置文件,這一篇主要講講如何在應用配置文件,提高WCF程式的靈活性。在編寫WCF服務應用程式時,編寫配置項也是其中一項主要工作,在前面的幾個示例中我也使用過配置文件,通過配置文件來簡化代碼。WCF通過公開終結點,向客戶端公開服務,包括服務的地址、服務用... ...


一、概述

  我們在前面章節中講了寄宿,在前面的實例中也用到了配置文件,這一篇主要講講如何在應用配置文件,提高WCF程式的靈活性。在編寫WCF服務應用程式時,編寫配置項也是其中一項主要工作,在前面的幾個示例中我也使用過配置文件,通過配置文件來簡化代碼。WCF通過公開終結點,向客戶端公開服務,包括服務的地址、服務用於發送和接收消息的傳輸和消息編碼,以及服務需要的安全類型等。當我們把這些配置項寫入到配置文件後,我們無需編譯即可修改WCF的一些可變信息,提高了程式的靈活性。

註意:

1)在代碼里寫了配置,那麼配置文件中的配置項將不起作用。

  2) Web程式在Web.config中配置,應用程式中在App.config中配置。

  WCF能夠建立一個跨平臺的安全、可信賴、事務性的解決方案,是一個WebService,.Net Remoting,Enterprise Service,WSE,MSMQ的並集,有一副很經典的對比圖如下:

WCF與其他分散式技術對比表

二、WCF中的 "A","B","C" 介紹

  我們先看個生活中的例子,某一天,O2O公司接到一份上門美甲服務訂單,美甲師上門服務的過程可以選擇的交通方式為“電動車”、“公交”、“地鐵”,到了客戶的家裡,你要找到客戶,服務完成之後,需要一份客戶的服務評價和付款確認。

  要完成這項工作任務我們執行以下幾個主要的步驟:

  (1)我們首先要知道客戶所在的地址,引出WCF中的"A"。

  A(Address):英文理解為"地址",在電腦中是通過一個URI唯一地址標識,通過這個地址我們可以找到我們要調用的WCF服務。

  (2)美甲師還要選擇相應的交通方式,每種交通方式達到的結果不一樣。如:電動車需要自備車輛,時間上視道路情況而定。公交最便宜,並且可選擇多條線路,時間可控性差。地鐵最方便,但是偶爾會很擠,一般都沒座等等,引出WCF中的"B"。

       B(Binding):英文理解為"捆綁,綁定", Binding實現在 客戶端和服務端通信的所有底層細節。比如客戶端與服務端之間傳遞的Message是如何編碼的—— text/XML, binary,MTOM;這種Message的傳遞是採用的哪種Transport——TCP, Http, Named Pipe, MSMQ; 以及採用怎樣的機制解決Secure Messaging的問題——SSL,Message Level Security。

       (3)到了客戶家裡之後我們能做哪些事?I.給客戶美甲,II.拿服務評價與付款確認。我們不能要求客戶給其他的東西,引出WCF中的"C"。

        C(Contract):英文理解為"合同",合同是什麼?告訴我們哪些事能做,如些事不能做。 Contract的主要的作用是暴露某個WCF Service所提供的所有有效的方法。Contract實際上是把每個方法的轉化成為相對應的消息。從Message Exchange的層面上講,Contract實際上是抱每個操作轉化成為相對應的Message Exchange Pattern——MEP(Request/Response; One-way; Duplex)

         4) Behavior: Behavior的主要作用是定製Endpoint在運行時的一些必要的Behavior。比如服務端回調客戶端時超時了;客戶端採用的Credential type;以及是否支持Transaction等。

 

三、Endpoint(終結點)

  WCF實現了網路系統的各個應用程式的通信。各個應用程式的通信是以“終結點(Endpoint)”的來實現的。我們在上面講的實際例子中的A、B、C即是Endpoint 的組成部分,他是伺服器間通信調用的入口。

四、應用程式間通信

  我們在第二和第三項中講了A、B、C與Endpoint,現在正式進入應用程式間的通信。我們還是以剛纔上門美甲的過程為例:

 

  美甲師手裡有一張訂單,標記著:地址、綁定、合同.....而客戶手裡也有一張訂單,標記著同樣的內容,並且一直得在等待美甲師的出現。只有當訂單上的內容一樣時,美甲師才會替客戶服務,客戶在服務完成之後會進行服務評價與付款確認。

  當我們寄宿WCF服務的時候,我們必須定義一個或是多個終結點,然後 服務端通過監聽這些終結點來處理客戶端發來的請求。由於應用程式之間是靠Endpoint來通信,那麼我們在客戶端也必須定義終 結點,只有當客戶端與服務端的終結點完全匹配的時候才能進行通信。

 

  如上圖所示:只有EndpointA中的A、B、C與EndPointB中的A、B、C完全匹配時才能通信。EndPointE與EndpointD也是一樣的。

五、實例

1)服務配置的主要部分

  在.config中配置文件中的configuration節點下麵有:<system.serviceModel></system.serviceModel>節點,在這個節點中主要有三個平級的部分。如下代碼所示:

 

 <?xml version="1.0" encoding="utf-8"?>
   <configuration>
     <system.serviceModel>
       <!--配置服務和終結點開始-->
       <services>
         <service>
           <endpoint></endpoint>
         </service>
      </services>
      <!--配置服務和終結點結束-->
      <!--配置綁定開始-->
      <bindings>
        <netTcpBinding>
          <binding>
          </binding>
        </netTcpBinding>
      </bindings>
      <!--配置綁定結束--> 
      <!--配置行為開始-->
      <behaviors>
        <serviceBehaviors>
          <behavior>
          </behavior>
        </serviceBehaviors>
      </behaviors>
      <!--配置行為結束--> 
    </system.serviceModel>
  </configuration>

 

 

  Service配置節[必須有]:配置服務、介面和終結點。每個Service都會有以下兩個屬性。name:名稱空間.類名[服務的具體實現類]。behaviorConfiguration:一個在behaviors節點中找到的名稱。

  Binding配置節[可有可無]:配置綁定,如http,tcp等

  Behavior配置節[可有可無]:配置行為,如認證等。

2)實例

 

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true"/>
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's

  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <protocolMapping>
      <add scheme="http" binding="basicHttpBinding"/>
      <add scheme="net.tcp" binding="netTcpBinding"/>
      <add scheme="net.pipe" binding="netNamedPipeBinding"/>
      <add scheme="net.msmq" binding="netMsmqBinding"/>

</protocolMapping>
  <!--服務-->
<services>

<!--name:名稱空間.類型名-->
<!--behaviorConfiguration:behavior的名稱,請看behavior配置節的名稱-->
 
      <service behaviorConfiguration="simpleBehavior" name="WCFService.WCFService" >

   <!-- 除非完全限定,否則地址將與上面提供的基址相關,每個服務可以有多個Endpoint -->
         <!-- Address:指定這個Endpoint對外的URI,這個URI可以是個絕對地址,也可以是個相對於baseAddress的

                       相對地址。如果此屬性為空,則這個Endpoint的地址就是baseAddress-->

      <!--bindingConfiguration:binding的名稱,請看binding配置節的名稱-->
        <endpoint  name="endpointService"
           address="http://localhost:8000/WCFService"
           binding="basicHttpBinding"
           contract="WCFService.IWCFService">

        </endpoint>
        <!-- 此終結點不使用安全綁定,應在部署前確保其安全或將其刪除--> 

        <!--<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />-->

        <host>
  <!-- 每種傳輸協議的baseAddress,用於跟使用同樣傳輸協議Endpoint定義的相對地址組成完整的地址,

                 每種傳輸協議只能定義一個baseAddress。HTTP的baseAddress同時是service對外發佈服務說明頁面的URL -->

          <!--  <baseAddresses>
            <add baseAddress="http://localhost:8000/"/>
          </baseAddresses>-->
        </host>
      </service>
</services>
<!--行為-->

<behaviors>   

      <serviceBehaviors >
  <!-- httpGetEnabled - bool類型的值,表示是否允許通過HTTP的get方法獲取sevice的WSDL元數據 --> 

        <behavior  name="simpleBehavior">

          <serviceMetadata httpGetEnabled="true"  httpGetUrl="http://localhost:8000/WCFService/metadata" />
          <serviceDebug includeExceptionDetailInFaults="false"/>

        </behavior>
      </serviceBehaviors>
</behaviors>
  <!--綁定-->

    <bindings>

      <basicHttpBinding></basicHttpBinding>
      <basicHttpContextBinding></basicHttpContextBinding>

      <netMsmqBinding></netMsmqBinding>
      <netNamedPipeBinding></netNamedPipeBinding>
      <webHttpBinding></webHttpBinding>

      <wsHttpBinding>
        <binding >
          <security mode="Transport">
            <transport clientCredentialType="None">
            </transport>
            <message clientCredentialType="Certificate"/>

          </security>
        </binding>
      </wsHttpBinding>
      <wsDualHttpBinding></wsDualHttpBinding>
    </bindings> 

  </system.serviceModel>

  <startup>

    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>

  </startup>

</configuration>

 

 

結果如下圖:

 


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

-Advertisement-
Play Games
更多相關文章
  • 一、Linux的目錄結構 : Windows是以存儲介質為主的,主要以盤符及分區來實現文件的管理,然後之下才是目錄。但Linux的磁碟從邏輯上來說是掛載在目錄上的,每個目錄不僅能使用本地磁碟分區的文件系統,也可以使用網路文件系統NFS伺服器載入某特定目錄等。本質上來說,無論是目錄結構還是操作系統內核 ...
  • 一、Linux用戶管理 : 不同的用戶的文件都是放在同一個物理磁碟上的甚至同一個邏輯分區或者目錄里,但是由於Linux的用戶管理和許可權機制,不同用戶不能輕易查看、修改彼此的文件。 1. 查看用戶 : 只顯示用戶: pts表示偽終端,偽是相對於/dev/tty而言的,當使用/dev/tty7時每打開一 ...
  • linux系統中通過write命令給線上的其他用戶發送消息。 ...
  • 1.上傳zookeeper-3.4.6.tar.gz安裝包 2.解壓tar -xzf zookeeper-3.4.6.tar.gz 3.配置(先在一臺節點上配置) 3.1添加一個zoo.cfg配置文件 $ZOOKEEPER/conf mv zoo_sample.cfg zoo.cfg 3.2修改配置 ...
  • <html> <head> <meta name="viewport" content="width=device-width" /> <title>創建二維碼</title> <script src="~/Content/uploadify/jquery-2.1.1.min.js"></scrip ...
  • Winform中Treeview控制項失去焦點,將選擇的節點設置為高亮顯示 (2012-07-16 13:47:07)轉載▼標簽: winform treeview drawnode Treeview控制項--Name:tVtypeList將tVtypeList的HideSelection屬性設置為Fa ...
  • 前言 繼之前發的帖子【ORM-Dapper+DapperExtensions】,對Dapper的擴展代碼也進行了改進,同時加入Dapper 對Lambda表達式的支持。 由於之前缺乏對Lambda的知識,還是使用了拿來主義。研究了些案例,總歸有些問題: 1、只能生成sql、不能將值進行參數化。 2、 ...
  • 天創恆達UB530高清視頻採集卡USB游戲PS4視頻翻錄電影網路直播錄播會議HDMI採集盒 http://item.jd.com/1567495458.html 天創恆達UB5A0 USB採集卡HDMI 分量 網路會議ps4游戲視頻高清採集盒1080p http://item.jd.com/1542 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...