1. 程式人生 > >WCF : 如何將NetTcpBinding寄宿在IIS7上

WCF : 如何將NetTcpBinding寄宿在IIS7上

摘要 : 從IIS 7 開始, IIS增加了對非HTTP協議的支援. 因此, 自IIS 7之後, 可以將NetTcpBinding等非HTTP協議的Bindings直接寄宿在IIS上面. 本文將介紹如何在IIS上配置WCF NetTcpBinding, 並且對其工作的方式進行比較深入的討論.

Windows Process Activation Service

下圖是IIS監聽在HTTP協議上的工作方式. 對HTTP協議的監聽是在核心模式下的HTTP.sys的幫助下完成

introduction-to-iis-architecture-101-OverviewOfHTTPRequest[1]

從IIS7開始,IIS還加入了對非HTTP協議的支援。對於那些採用非HTTP協議,但是又需要部署在IIS裡面,從而利用IIS優秀的管理功能的服務來說,比如WCF服務,可謂一大福音。IIS7可以支援多種非HTTP協議,比如net.tcp,net.msmq, net.pipe等。由於HTTP.sys並不會監聽非HTTP協議的埠. 對於非HTTP協議, 則有各自的Windows Serivce來進行監聽. 例如Net.Tcp協議, 則是由Net.Tcp Port Sharing Service和Net.Tcp Listener Adapter服務進行監聽, 並且寄宿在SMSvcHost.exe中.

Picture1

進過拆分之後, WAS不僅處理HTTP請求,還可以處理非HTTP協議的請求。HTTP請求是由Http.sys截獲的,並且在傳遞給WAS之前,就已經傳遞給w3svc中的HTTP管理器,但是,其他請求都是通過WAS偵聽器的介面卡介面轉發給配置管理器和程序管理器的,而沒有經過w3svc。

關於 WAS的介紹可以參考這裡 :

為了讓IIS支援net.tcp,必須先安裝WAS(Windows Process Activation Service),即windows程序啟用服務。

開啟控制面板--程式和功能--開啟或關閉windows功能,安裝WAS,如圖:

安裝完畢後在Services視窗中可以到到如下服務:Windows Process Activation Service;Net.Msmq Listener Adapter;Net.Pipe Listener Adapter;Net.Tcp Listener Adapter;Net.Tcp Port Sharing Service.這幾個服務。確定Net.Tcp Listener Adapter 與Net.Tcp Port Sharing Service是否已經啟動。

image

同樣, 也需要檢查WCF是否啟用了Non-Http的支援. .Net Framework 3.5和 .Net Framework 4.5分別有各自的支援. 

image

不過上述的Services只會存在一個, 如果伺服器上只有.Net Framework 3.5本版的被啟用, 則這些Services則只能使用3.5版本的DLL. 如果.Net Framework 4.5版本一旦被啟用, 無論是否同時啟用了3.5版本, 則會使用4.5版本. 可以通過服務所使用的SMSvcHost.exe來判斷實際使用了那一個版本.

image

IIS 上的配置

在IIS中,選中你的網站,然後在右邊的操作選單欄中單擊繫結,會彈出一個“網站繫結”視窗,點選新增,型別選擇net.tcp

image

選擇你的網站,點選“高階設定”,彈出的的窗體中,在“已啟用的協議”一欄中手動新增:net.tcp. 做完這一步之後, 該網站即增加了對net.tcp協議的支援.

image

示例

示例是用VS2012新建的WCF模板. 

 1     public class Service1 : IService1
 2     {
 3         public string GetData(int value)
 4         {
 5             return string.Format("You entered: {0}", value);
 6         }
 7 
 8         public CompositeType GetDataUsingDataContract(CompositeType composite)
 9         {
10             if (composite == null)
11             {
12                 throw new ArgumentNullException("composite");
13             }
14             if (composite.BoolValue)
15             {
16                 composite.StringValue += "Suffix";
17             }
18             return composite;
19         }
20     }


下面是使用了NetTcpBinding的WCF Service的配置.

<?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="NewBinding1" />
      </netTcpBinding>
    </bindings>
    <services>
      <service name="NetTcpSite.Service1">
        <endpoint binding="netTcpBinding" bindingConfiguration="NewBinding1"
        contract="NetTcpSite.IService1" />
        <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
          contract="IMetadataExchange" />
        
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>

由於WCF 4.5對預設配置進行了優化. 所以即使沒有關於HTTP協議的任何配置, WCF Service預設情況下也能通過瀏覽器的方式訪問到WSDL.

image

如果要訪問NetTcpBinding的WCF Service則需要一個同樣採用Net.TCP協議的客戶端. 這裡, 我使用了VS 2012來完成.

image

下面是WCF客戶端的的配置和程式碼.

    class Program
    {
        static void Main(string[] args)
        {
            using (NetTcpService.Service1Client proxy = new Service1Client())
            {
                Console.WriteLine(proxy.GetData(10));
            }
            Console.ReadLine();
        }
    }
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
        <bindings>
            <netTcpBinding>
                <binding name="NetTcpBinding_IService1" />
            </netTcpBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://localhost/NetTcpSite/Service1.svc"
                binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IService1"
                contract="NetTcpService.IService1" name="NetTcpBinding_IService1">
                <identity>
                    <servicePrincipalName value="host/LIGHTWEAPON.fareast.corp.microsoft.com" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

我們進一步來觀察是哪一個程序監聽在Net.Tcp佔用的808埠上. 從下圖上可以驗證出, 監聽在808埠上的程序是2060. 這個程序ID是SMSvcHost.exe, 也就是上面提到的各種Services的宿主程序.

image

相關推薦

WCF : 如何NetTcpBinding寄宿IIS7

摘要 : 從IIS 7 開始, IIS增加了對非HTTP協議的支援. 因此, 自IIS 7之後, 可以將NetTcpBinding等非HTTP協議的Bindings直接寄宿在IIS上面. 本文將介紹如何在IIS上配置WCF NetTcpBinding, 並且對其工作的方式進行比較深入的討論. Windo

WCF綁定netTcpBinding寄宿到控制臺應用程序

eth man args void protoc ren session cap client 契約 新建一個WCF服務類庫項目,在其中添加兩個WCF服務:GameService,PlayerService 代碼如下: [ServiceContract] public

WCF綁定netTcpBinding寄宿到IIS

測試 edi imp tegra bsp enable buffer red svc 繼續沿用上一篇隨筆中WCF服務類庫 Wettery.WcfContract.Services WCF綁定netTcpBinding寄宿到控制臺應用程序 服務端 添加WCF服務應用程序 We

本地項目傳到git

mit long detail bsp span strong ilo details 命令 第一步:建立git倉庫 cd到你的本地項目根目錄下,執行git命令 git init 第二步:將項目的所有文件添加到倉庫中 git add .   註意:如果想添加某個特

如何用命令本地項目傳到github

軟件 是把 tar 地址 key 安裝方法 打開 com baidu 一、Git終端軟件安裝 1、下載windows上git終端,類似shell工具,下載地址:http://msysgit.github.io/ 2、安裝方法,打開文件,一路點擊Next即可 3、安裝完成,

中國在Sailfish基礎開發移動操作系統

bio efi aid -1 p2s music 中國 list his %E5%BE%AE%E4%BF%A1%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BC%80%E5%8F%91%E8%80%85%E8%AF%A5%E4%BD%95%E5%8E%BB%

詳細教程:本地項目傳到github

--help ror list led publickey id_rsa -h 一行 ble   作為 一個工程師,將本地項目上傳到github進行備份和分享是一個不錯的技能,一來可以方便以後的工作,二來可以分享自己的成果。所以下面本人詳細教大家如何將本地項目上傳到gith

十年磨一劍,水產寶與升鮮寶即將橫空出世,正面與市面的商業軟件競爭。用小米加步槍對洋槍洋炮。升鮮寶為杭州生鮮配送企業服務,8年的生鮮電商行業沈澱。

不一致 img 管控 賺錢 很難 blog 生鮮電商 不知道 同時 一直堅守著.net開發陣營,一直致力於生鮮配送行業的信息化解決方案。用程序員本來的堅持,在這個行業中,默默的承受著,不斷優化流程。不斷的實踐。 生鮮配送企業的

linux 一個服務器的文件或文件夾拷貝到另一個服務器(轉載)

轉載 oca href 計算機名稱 http 目錄命令 遠程服務器 target blog 復制文件或目錄命令: 復制文件: (1)將本地文件拷貝到遠程 scp 文件名用戶名@計算機IP或者計算機名稱:遠程路徑 本地192.168.1.8客戶端 scp /r

Git的使用--如何本地項目傳到Github

git教程 .com example readme key 創建 round 一個 提示 很早之前就註冊了Github,但對其使用一直懵懵懂懂,很不熟練。直到昨天做完百度前端技術學院的task,想把代碼托管到Github上的時候發現自己對於Git的操作是如此之愚鈍,所以今天

IIS7傳4M文件以上文件出現“Post大小超出允許的限制”錯誤解決方法

iis7 div request 節點 bsp edi 大小 style rect 在web.config文件中的system.web節點中添加如下這句,即40M <system.web> <httpRuntime maxRequestLengt

使用canvas給圖片添加水印, canvas轉換base64,,canvas,圖片,base64等轉換成二進制文檔流的方法,並合成的圖片傳到服務器,

web don 可能 work box rac return ros font 一,前端合成帶水印的圖片 一般來說,生成帶水印的圖片由後端生成,但不乏有時候需要前端來處理。當然,前端處理圖片一般不建議,一方面js的處理圖片的方法不全,二是有些老版本的瀏覽器對canvas

本地代碼傳到github

版本 目的 mage font AD 參數 master bsp 拉取 本質上就是本地倉庫與遠程倉庫這兩個倉庫進行遠程同步的過程 一.創建本地倉庫 1.cd到你的本地項目根目錄下,執行git命令,git init 2.將項目的所有文件添加到倉庫中,git add -A

28. VMware 服務器的虛擬機備份到 Azure(中)

雲計算 雲平臺 接下來在 vCenter 服務器上創建角色和用戶帳戶,登錄到管理WEB界面 選擇系統管理 選擇角色,點擊+號,創建一個角色名稱為BackupAdminRole,並勾選賦予哪些權限,然後確定。 勾選哪些權限可以參考下圖 接下來創建 vCenter 服務器用戶帳戶和權限,設置Bac

29. VMware 服務器的虛擬機備份到 Azure(下)

雲計算 雲平臺 接下來就是按照以前DPM的備份方式創建保護組了,也就是我們常規理解的創建備份任務 下一步 在這裏就可以正確讀取到VMware環境中的虛擬機列表信息,並選擇需要備份的虛擬機了 訂閱保護組名稱 定義保護周期以及備份時間點(在“指定短期目標”頁上,為“保留期”指定磁盤中存儲的恢復點的

27. VMware 服務器的虛擬機備份到 Azure(

雲計算 雲平臺 配置 Azure 備份服務器來保護 VMware 服務器工作負荷。 上一篇文章中我已經安裝好Azure備份服務器了,Azure 備份服務器可以備份或幫助保護 VMware vCenter Server 版本 6.5、6.0 和 5.5。 這篇文章為了給大家演示出可感知工作負載類型的備份

如何用命令本地項目傳到git

http tps repos post 一個 ast 操作 img 問號 1. 打開在你的項目文件夾,輸入下面的命令 git init 輸完上面的命令,文件夾中會出現一個.git文件夾,如下圖所示,其他的的文件也會出現藍色小問號的標誌 2. 添加所有文件

如何本地項目傳到Git 版本庫

命令 所有 git 告訴 使用 clas body 管理 忘記 1、(先進入項目文件夾)通過命令 git init 把這個目錄變成git可以管理的倉庫 git init 2、把文件添加到版本庫中,使用命令 git add .添加到暫存區裏面去,不要忘記後面的小數點

本地項目傳到Github

exist mit exists set bubuko 之間 rsa IT 添加 一直都想學習Github的使用,很早就註冊了賬號,但總以為很難,不敢嘗試。又想向別人一樣把自己做的一些東西分享出來, 同時也是一個托管代碼的好地方,終於硬著頭皮試了試怎麽上傳代碼,現在才發現原

Git的使用--本地項目傳到Github

所有 倉庫 文件夾 code title img pull gen info 1.新建一個項目(文件夾),將要上傳的項目放進去; test上傳github是我新建的文件夾,es6-Setting-up-the-environment是我要上傳的項目; 2.進入D:\tes