初識WCF6

来源:http://www.cnblogs.com/janghe/archive/2017/09/28/7607834.html
-Advertisement-
Play Games

參考:http://blog.csdn.net/songyefei/article/details/7397296 元數據交換 通過前兩篇的學習,我們瞭解了WCF通信的一些基本原理,我們知道,WCF服務端和客戶端通過共用元數據(包括服務協定、伺服器終結點信息)在兩個終結點上建立通道從而進行通信。我們 ...


參考:http://blog.csdn.net/songyefei/article/details/7397296

元數據交換

通過前兩篇的學習,我們瞭解了WCF通信的一些基本原理,我們知道,WCF服務端和客戶端通過共用元數據(包括服務協定、伺服器終結點信息)在兩個終結點上建立通道從而進行通信。我們通過手寫代碼(或配置)的方式為服務端編寫了元數據信息,沒有藉助元數據交換就實現了通信。然而在實際應用中,元數據往往是很多的,而且重覆編寫元數據的工作也是不值得的,因此必然會用到元數據交換的方式讓客戶端獲取元數據,本篇我們就來進一步瞭解一下元數據和元數據交換。

1. 元數據是怎樣提供的

    我們知道,元數據包括了要和服務端進行通信的所有信息,包括服務協定介面、服務端終結點地址、綁定等信息,它指出了客戶端應該到何處去尋找服務以及怎樣調用服務的一切線索。但是服務端是怎樣公佈其元數據的呢?
    答案是使用WSDL文件,WSDL即Web Service Description Language,Web服務描述語言,它是一個XML文件,在這個文件中按照一定的標準來對Web Service進行描述,他是符合W3C標準的,因為WCF是被設計為供不同平臺調用的服務框架,所以客戶端可能是非微軟平臺的,比如Java什麼的。因此WCF必須使用WSDL這種國際標準的描述方法來描述服務才能被眾多的平臺所訪問。

 

2. 元數據交換的過程是怎樣的

在WCF服務端的運行時,有一組類庫隨時待命把服務的元數據輸出為WSDL描述提供給請求者,只要有客戶端按照服務端約定的方法來請求元數據,服務端立即將服務運行時狀態寫成WSDL文件提供。客戶端得到的實際上就是WSDL文件(還有一些框架描述文件XSD),客戶端拿到文件後再使用自己的方法來解讀WSDL,把他翻譯成客戶端可用的源代碼或配置文件,這時客戶端就得到了服務的編程模型,通過一些代理類,客戶端甚至可以像調用本地對象一樣使用WCF服務。

 

因此整個過程是這樣:客戶端向服務端請求元數據交換-->服務端運行時將元數據編寫成WSDL文件提供-->客戶端獲得文件-->客戶端翻譯文件-->客戶端根據翻譯結果生成本地類代碼和配置-->客戶端獲得服務的本地編程模型。這就是元數據交換的過程。

3. 獲得WSDL

在微軟平臺中,有兩種方法來進行元數據交換,第一是使用服務引用,第二是使用元數據實用工具(svcutil.exe)來進行,我們先學習這個工具。

這個工具可以在Windows SDK中找到,具體位置為 C:\Program Files\Microsoft SDKs\Windows\v6.0\Bin,如果你有VS2010,可以啟動VS2010的命令行工具,這樣就可以在任何目錄下使用這個程式。

我們先看一個例子,就是我們在前幾篇中建立的IIS服務HelloWCFService,它被我寄宿在IIS中。

源代碼如下(HelloWCF.cs):

using System;  
using System.ServiceModel;  
  
namespace LearnWCF  
{  
    [ServiceContract]  
    public interface IHelloWCF  
    {  
        [OperationContract]  
        string HelloWCF();  
    }  
  
    public class HelloWCFService : IHelloWCF  
    {  
        public string HelloWCF()  
        {  
            return "Hello WCF!";  
        }  
    }  
} 

配置文件(web.config)如下:

    <configuration>  
      <system.serviceModel>  
        <services>  
          <service name="LearnWCF.HelloWCFService" behaviorConfiguration="metadataExchange">  
            <endpoint address="" binding="wsHttpBinding" contract="LearnWCF.IHelloWCF"/>  
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>  
          </service>  
        </services>  
        <behaviors>  
          <serviceBehaviors>  
            <behavior name="metadataExchange">  
              <serviceMetadata httpGetEnabled="true"/>  
            </behavior>  
          </serviceBehaviors>  
        </behaviors>  
      </system.serviceModel>  
    </configuration>  

在瀏覽器中輸入服務地址會如下圖所示:

看到系統提示的那行命令了麽?系統在告訴我們如何使用svcutil.exe來獲得元數據。我們現在試一下,首先打開VS2010命令行:

開始-->所有程式-->Visual Studio 2010-->Visual Studio Tools-->Visual Studio命令行提示

 

 

 

我們導航到一個目錄下準備獲得元數據文件。

我們暫時不按照瀏覽器提供給我們的方法做,因為按照那個方法做就把獲得WSDL和翻譯WSDL為客戶端代碼合在一起了,我們先獲得WSDL元數據文件,看看它是什麼樣子的。我們按如下的指令做:

svcutil.exe /t:metadata http://localhost/iisservice/hellowcfservice.svc?wsdl  

我們加入了一個參數/t:metadata 表示只輸出元數據,不生成代碼。命令的執行過程如下:

可以看到生成了3個文件,包括兩個架構文件和一個WSDL文件,這些就是服務端元數據的描述了,所有的客戶端請求到的實際上都是這個文件。WSDL的規範比較多,關於它的內容,我們今後再展開來看,不過簡單的打開看一下就能看出一些與服務協定、綁定、操作這些東西相關的地方。

4. 翻譯WSDL文件

WSDL是一個XML文件,其實就是個文本文件,客戶端必須將其按照自己的平臺特點把他翻譯成本地代碼文件來使用。svcutil當然會提供這個功能。在wsdl文件所在目錄下使用如下的命令就可以把WSDL文件翻譯成本地代碼文件:

 svcutil *.wsdl *.xsd

顧名思義,就是根據當前目錄下的所有的WSDL文件和XSD文件來生成客戶端代碼文件。過程會是這樣

可以看到,生成了一個cs文件和一個配置文件,這些就是根據WSDL文件翻譯成的客戶端代碼文件了。打開來看看,一定不陌生,就是使用ClientBase<>來生成一個客戶端代理類並把終結點的信息配置在了.config文件里。把這兩個文件包含在客戶端的項目中並把output.config改成app.config就可以了。

4. 更好地使用元數據交換工具

之前我們瞭解了使用svcuitl.exe來獲取WSDL並翻譯成客戶端代碼的過程。實際上這兩步可以合二為一。直接執行下麵的命令可以直接獲得客戶端文件:

svcutil.exe http://localhost/iisservice/hellowcfservice.svc?wsdl

這樣它就不會生成WSDL而直接生成客戶端文件了。

不過按照這樣的方式生成的文件可能不太符合我們的要求,我們可以加上一些參數來指定我們輸出的文件名:

svctuil.exe /out:ClientProxy.cs /config:app.config http://localhost/iisservice/hellowcfservice.svc?wsdl 

這樣輸出的文件我們就可以直接包含在客戶端項目中使用了。

5. 使用服務引用

其實使用服務引用跟使用svcutil.exe生成的客戶端模型是一樣的,不過服務引用保留了WSDL文件(以及一些相關的七七八八的文件),沒有svcutil.exe來得那麼清爽,但是它跟VS2010集成,使用起來很簡單,而且當服務發生變化時,只需要右擊服務引用選擇更新服務就可以重新下載WSDL了

 

6. 展開一點點

 

作為服務端,公開元數據是需要配置的,不同的配置會導致元數據公開的方式不同。

 

我們要記住,WCF服務端公開元數據必須具備兩個條件:

 

(1) 為服務添加ServiceMetadata行為。

 

(2) 打開元數據交換終結點。

 

二者缺一不可。

 

WCF的公開元數據的手段主要有兩種:

 

第一種:通過HTTP GET方法。

 

這就是在前文中我們看到的方法,我們可以使用HTTP Get的方法來獲得WSDL文件即在服務地址.svc後面跟上?wsdl的方法直接請求到WSDL文件。我們可以直接在瀏覽器中輸入服務端地址.svc?wsdl,瀏覽器就直接獲得了WSDL文件併為我們顯示出來了。

 

還有相應的框架描述文件(XSD)

 

如果想採用這種元數據公開方式,必須配置服務的ServiceMetadata行為,並指定httpGetEnabled = "true",而元數據公開終結點不必配置,系統會自動配置一個,配置文件的寫法如下:

    <configuration>  
      <system.serviceModel>  
        <services>  
          <service name="LearnWCF.HelloWCFService" behaviorConfiguration="metadataExchange">  
            <endpoint address="" binding="wsHttpBinding" contract="LearnWCF.IHelloWCF"/>  
          </service>  
        </services>  
        <behaviors>  
          <serviceBehaviors>  
            <behavior name="metadataExchange">  
              <serviceMetadata httpGetEnabled="true"/>  
            </behavior>  
          </serviceBehaviors>  
        </behaviors>  
      </system.serviceModel>  
    </configuration>  

在這種配置下,訪問元數據的方法是訪問下麵的地址:

http://localhost/iisservice/hellowcfService.svc?wsdl 

第二種:通過MEX元數據交換終結點。

在這種方式下,我們首先要保證服務擁有ServiceMetadata行為,但是httpGetEnabled可以不必為true。此外我們還需要為服務顯式地添加一個終結點,這個終結點的地址、綁定和協定都是指定的我們不能更改

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

配置文件的寫法如下:

    <configuration>  
      <system.serviceModel>  
        <services>  
          <service name="LearnWCF.HelloWCFService" behaviorConfiguration="metadataExchange">  
            <endpoint address="" binding="wsHttpBinding" contract="LearnWCF.IHelloWCF"/>  
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>  
          </service>  
        </services>  
        <behaviors>  
          <serviceBehaviors>  
            <behavior name="metadataExchange">  
              <serviceMetadata />  
            </behavior>  
          </serviceBehaviors>  
        </behaviors>  
      </system.serviceModel>  
    </configuration>  

如果按這種配置,我們必須按照如下地址來訪問公開的元數據:

http://localhost/iisservice/hellowcfservice.svc/mex

註意,由於沒有開啟HTTP GET,我們不能在瀏覽器中直接輸入這個地址來獲取WSDL了(會提示400錯誤),我們必須通過svcutil.exe或添加服務引用的方式來訪問。

使用svcutil.exe或服務引用的時候可以不關心元數據公開方式是HTTP GET還是Mex,他們會自動尋找到合適的方式,只需要把服務的svc文件地址輸入就可以了,但是我們應該知道,這兩種元數據公開的方式是有區別的。

6. 總結

通過今天的學習,我們進一步瞭解了WCF元數據的和元數據交換的原理。雖然我們在實際工程中都會並且應該使用元數據交換工具來幫助提高效率,但是這背後發生的所有環節也是我們應該掌握的。

相關資源

MSDN關於Svcutil.exe用法的文檔

http://msdn.microsoft.com/zh-cn/library/aa347733.aspx

 


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

-Advertisement-
Play Games
更多相關文章
  • echo:顯示一段文字 比如: echo hello,串口上就顯示hello echo hello > /dev/tty1, LCD上便顯示hello欄位 cat:查看一個文件的內容 比如: cat Makeflie,串口上就顯示Makeflie文件的內容 cat Makeflie > /dev/t ...
  • Unix文件是以位元組序列組成的信息載體(container),內核不解釋文件的內容。 Linux文件系統中的文件是數據的集合,文件系統不僅包含著文件中的數據而且還有系統的結構,所有Linux用戶和程式看到的文件、目錄、軟鏈接及文件保護信息等都存儲在其中。 Linux最早的文件系統是Minux,但是專 ...
  • 腳本的作用不明而喻,在無數次的啟動開發板過程中,不斷登錄確確實實占用了我大量的時間及精力; 於是上網根據自己的實際編寫了一個腳本: !/usr/bin/expect -f的意義:http://blog.csdn.net/zhu_tianwei/article/details/44180637 如果在 ...
  • 值類型:(原話定義)值類型的變數直接包含值,換言之變數引用的位置就是值在記憶體中實際存儲的位置。 這句話也就是說,值類型的賦值是不會引用同一記憶體位置的,除了out和ref參數,更改原始變數不影響其它變數的值(因為變數歌有各的位置) 棧 依次向下: int number1 =42; char lette ...
  • 如果說界面設計,那麼自適應問題一定無法避免,今天就來分享一下,wpf如何實現自適應,先看一下效果:(文末添加源代碼下載) 基本思路就是用 Grid 的網格,進行寬度的自動填充適應, 不過對於複雜的頁面,佈局起來可能比較麻煩, 這裡推薦結合 DockPanel 和 Grid 一起使用,對於頁面一些不需 ...
  • 第一步:上圖 第二步:上代碼 >>>>>>>>>>>源代碼下載<<<<<<<<< 第三步:說明 版本說明 v2.1 2017年9月28日19:37:39 qq1222698好多年不更新,應浩哥的要求,增加一些功能1、去掉自動回覆功能,加上自動發送功能2、增加回車功能、自動crc功能3、不再打包,自己 ...
  • 在繼承中,子類擁有父類的一切屬性和行為,而且任何父類出現的地方,都可以用子類來替代;可謂“長江後浪推前浪”啊 object是一切類的父類 泛型在編譯的時候確定類型(延遲思想); 泛型:用一個方法,來滿足不同類型的參數;泛型實際上是語法糖,由編譯器提供功能;沒有性能損失 泛型參數的個數可以隨便定義 貼 ...
  • 第一次寫隨筆,心裡有一些小激動。 第一次做金蝶二開,所以一臉懵逼,搜遍博客園和CSDN,都沒找到相關的帖子。 最後在金蝶研發部某大佬的幫助下,最終得逞所願!在此感謝這位大佬! 我的做法是在插件表單上添加一個進度條進行隱藏,添加進度條的目的是防止初始化載入後,防止線程被銷毀。 至於我的這個做法能不能入 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...