簡體   English   中英

IIS WCF服務托管與Windows服務

[英]IIS WCF service hosting vs Windows Service

我們開發了WCF服務,我們正在尋求部署它。 我們的客戶將使用basicHttpBinding但我們的內部團隊將使用namedPipesBinding

我們想知道在IIS 7或Windows服務中托管它是否更好。 我們運行了一些測試,我們發現當我們在IIS中添加綁定時,它不會更新我們服務的配置文件。 這意味着我們需要在兩個不同的地方維護配置。 這不符合邏輯,對嗎?

我們還在StackOverflow上讀到當WCF服務是IIS中的主機時忽略基址(請參閱有關<baseAddresses>的WCF服務配置文件問題

在IIS中托管有許多優點和許多缺點。

是的,IIS為您提供按需加載 - 這可以是加號或減號。 當請求進入時,構造ServiceHost,然后實例化托管的服務類,並處理請求。 沒有什么需要全天候運行。 但與此同時,每次收到消息時,這種設置都需要更多的時間和精力,而且作為程序員,您真的無法控制服務主機。

是的,使用IIS,* .svc文件所在的虛擬目錄定義了您的地址 - 您的配置中的任何基地址或明確定義的地址都將被忽略。 並且不需要太多努力,您就無法更改服務地址的布局 - 它們總是為http://servername/virtualdirectory/YourService.svc (包括.svc擴展名)。

自托管通常更快,因為您的ServiceHost已經啟動並運行 - 但是由您來確保它真正啟動並運行,每當有消息進入時都沒有“按需”加載 - 無論是它還是可以服務請求,或不。 但是您可以更好地控制服務主機 - 何時以及如何構建服務主機等等,您可以根據需要選擇並定義服務地址。

我個人幾乎總是選擇使用自托管 - 在控制台應用程序中進行測試,在NT服務中進行生產。 對我來說,這似乎是更合適的方式,也是更加可控的方式。 你必須做更多的工作 - 但你確切知道你在做什么。

marc_s通常給出我完全同意的很好的答案,但在這種情況下,我沒有。
WCF的自托管並不是一個好主意,特別是微軟即將發布都柏林技術。 在IIS中托管時,WCF(和WF)應用程序的管理和操作要簡單得多。

此外,您還可以獲得按需加載。

IIS7.5(WS2008 R2)有一個永遠在線的選項。

如果困擾你,你可以輕松地進行URL重寫以省略.svc。

有趣的tidbit->在閱讀這個帖子后,我在MSDN中遇到了關於使用Windows服務托管WCF服務的這些詞:

以下是Windows服務的一些缺點:

•部署:必須使用.NET Framework Installutil.exe實用程序或通過安裝程序包中的自定義操作安裝服務。
•有限的功能:Windows服務仍然具有一組有限的開箱即用功能,以支持高可用性,易管理性,版本控制和部署方案。 基本上,您必須自己通過自定義代碼來滿足這些要求,例如,IIS默認情況下會提供其中的一些功能。 Windows服務確實增加了可恢復性和一些安全功能,但您仍需要自己做一些工作。
http://msdn.microsoft.com/en-us/library/bb332338.aspx

......以及以下鏈接:

托管服務:(漂亮的比較圖表)
http://msdn.microsoft.com/en-us/library/ms730158.aspx

回答這些問題:

我們運行了一些測試,我們發現當我們在IIS中添加綁定時,它不會更新我們服務的配置文件。 這意味着我們需要在兩個不同的地方維護配置。 這不是邏輯,對嗎?

當您使用IIS來托管服務時,必須配置App.config文件或web.config文件以允許IIS公開某些綁定,因此在配置文件中,您將把所有綁定放到wcf服務中。 Http,net.tcp等......

在綁定中,您不會指定地址,因為您將直接在IIS中指定這些地址。

在IIS中,您必須允許在網站的高級設置中使用綁定。 之后,您將為您的網站“Web服務”設置新的綁定,並添加您想要監聽的每個綁定,並指定地址。

您將直接在IIS中指定地址。

有一個例子。

你的配置文件:

<services>
    <service name="ServiceName">                    
        <endpoint address=""
            binding="basicHttpBinding"
            bindingConfiguration="httpMode"
            contract="IContract" />                 
        <endpoint address=""
            binding="netTcpBinding"
            contract="IContract" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    </service>
</services>

在你的IIS advenced設置你的意志

啟用協議中的http,net.tcp

之后,您將進入IIS綁定。 把你的綁定為http normaly並添加一個新的綁定net.tcp,在綁定配置中把端口和虛擬目錄放在一起

8001:*

此設置允許所有虛擬目錄連接到8001端口。

您還必須在服務器上安裝“WCF激活,(Http激活和非Http激活)”功能。

這個問題沒有標准答案。 我完全不同意Cheeso的答案(WCF的自托管並不是一個好主意)。

以下鏈接請檢查:( http://msdn.microsoft.com/en-us/library/ms730158.aspxhttp://msdn.microsoft.com/en-us/library/bb332338.aspx ),想想你的限制:

  • 操作系統
  • 預期的表現
  • 可用的HW
  • 預期可用性

你會發現在很多情況下“自托管”是最好的選擇。

IIS為您提供了許多開箱即用的功能,如應用程序域重新加載,監控等。

這就是為什么你應該首先回答這個問題:你是否需要所有這些功能? 如果沒有 - 可以考慮Windows服務。

雖然這里有選擇的答案,但我將允許自己發布一個Q / A線程鏈接。

如何在IIS中托管時從代碼配置WCF服務?

您在我的答案中找到的內容(及其中的鏈接)是您對服務主機的精細控制,無論您是在WService中還是在IIS中加載它。

在服務啟動時,您可以將IIS與其具有的綁定進行交互,並創建適當的端點。 通過Microsoft.Web.Administration命名空間查找IIs配置。

希望這個對你有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM