2009-10-13 245 views
44

我們開發了一個WCF服務,我們正在尋找部署它。 我們的客戶將與basicHttpBinding一起使用,但我們的內部團隊將與namedPipesBinding一起使用。IIS WCF服務託管與Windows服務

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

基址被忽略時,WCF服務主機在IIS中,我們也看到在計算器上(見WCF service configuration file question regarding <baseAddresses>

+1

它總是取決於上下文。根據微軟的說法,「你不應該考慮企業場景的自託管,在企業項目的開發或演示階段,自託管是合適的」https://msdn.microsoft.com/zh-cn/library/bb332338。 aspx – Jayee 2016-06-22 04:35:28

回答

10

要在這些問題答案:

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

當您使用IIS託管你的服務,你必須配置您的App.config文件或web.config文件,以允許IIS揭露一些有約束力的,所以在配置文件中,你會把所有的綁定,允許到您的wcf服務。 Http,net.tcp等...

在你的綁定你不會指定地址,因爲你將直接在IIS中指定這些地址。

在IIS中,您必須允許您的網站的高級設置中可用的綁定。之後,您將爲您的網站「網絡服務」設置新的綁定,並添加您想要監聽的每個綁定,並指定地址。

您將直接在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設置上級篇你就會把

HTTP,在的net.tcp啓用的協議

之後,你會在你走綁定到IIS。把你的HTTP normaly結合,並添加一個新的綁定的net.tcp,在綁定配置讓像

8001端口和虛擬目錄:*

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

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

+0

非常感謝,它解決了我與IIS的麻煩。 – esylvestre 2009-10-14 14:05:19

+0

http綁定是否也需要與net.tcp一起存在。如果我在綁定中只有net.tcp將被激活 – user55474 2011-02-02 13:00:24

5

IIS爲您提供了很多外的現成功能,如應用程序域重新加載,監控等。

這就是爲什麼你應該先回答這個問題:你需要這一切功能,或者不? 如果沒有 - 可以考慮windows服務。

+1

你是對的,但在問自己這些問題之前,我想知道我的服務的初始配置(綁定)是否可以由IIS管理。 – esylvestre 2009-10-13 14:48:56

71

主機在IIS中有許多優點和許多缺點。

是,IIS爲您提供了按需加載 - 這可能是一個加號或減號。當請求進入時,ServiceHost被構造,然後託管的服務類被實例化,並且處理請求。沒有什麼需要全天候運行。但是與此同時,這種設置在每次發送消息時都需要更多的時間和精力,而作爲程序員的您實際上對於服務主機並沒有太多的控制權。

是的,與IIS,其中* .svc文件駐留定義你的地址的虛擬目錄 - 在你的配置任何基地址或明確定義的地址被忽略。沒有太多努力,您無法更改服務地址的佈局 - 它們始終是http://servername/virtualdirectory/YourService.svc(包括.svc擴展名)。

因爲您的ServiceHost已經啓動並正在運行,所以自託管速度通常要快幾倍 - 但是要確保它的真正啓動和運行,每當有消息進入時就沒有「按需」加載,或者它已經啓動並且可以爲請求提供服務,或者不可以。但是,您對服務主機有更多的控制權 - 何時以及如何構建等,並且您可以根據需要選擇並定義服務地址。

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

馬克

+0

這正是我正在尋找的,但我想知道是否有工具來管理WCF服務時,他們自我託管?實際上,在IIS中託管它的主要目的是爲用戶提供一個友好的工具來配置我們的服務。 – esylvestre 2009-10-13 15:14:10

+1

「都柏林」可能是我期待的工具。 非常感謝。 – esylvestre 2009-10-13 17:09:46

+0

WCF的管理故事現在不是很輝煌 - 微軟承諾用更多的工具支持「都柏林」(服務器插件在.NET 4.0之後的某個時候發佈) – 2009-10-14 09:34:19

26

marc_s通常給出的是我完全同意偉大的答案,但在這種情況下,我不知道。
WCF的自託管並不是一個好主意,尤其是在Microsoft即將發佈都柏林技術的情況下。在IIS內部託管時,WCF(和WF)應用程序的管理和操作要簡單得多。

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

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

你可以輕鬆地做URL重寫省略.SVC如果你煩惱。

+5

我完全同意,你可以創建一個自定義的ServiceHostFactory來獲得對你的ServiceHost的更多控制。 – 2010-06-21 13:28:45

+0

通過IIS管理SSL證書和htttp端口綁定也更「容易」。 – 2016-09-26 13:51:18

+2

作爲最近的一個軼事例子,在IIS中託管相同的net.tcp消息日誌記錄服務會消耗3倍多的內存,並處理1/2請求數量,因爲「自我」託管Windows服務中的相同服務。 – StingyJack 2017-10-13 12:07:20

15

有趣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

7

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

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

  • 手術系統
  • 預期的表現
  • 可用HW
  • 預期可用性

和你會發現在許多情況下,「自我託管」是bes替代方案。

+0

引用自託管的缺點:有限的功能:自託管應用程序對高可用性,易管理性,健壯性,可恢復性,版本控制和部署方案的支持有限。至少,開箱即用的WCF不提供這些功能,因此在自主託管的場景中,您必須自己實現這些功能;例如,IIS在默認情況下提供了其中一些功能。微軟表示,自主託管並不是完全由於這些原因的服務的企業解決方案。請參閱此處的比較https://msdn.microsoft.com/en-us/library/ms730158.aspx – 2016-09-26 14:00:33

0

雖然這裏有選擇的答案,但我會允許自己發佈Q/A線程鏈接。

How to configure WCF service from code when hosted in IIS?

,你會在我的答案在那裏找到什麼(和它的鏈接)是你的了,你是否加載它WService或IIS服務主機精細控制。

服務啓動後,您可以對IIS進行intergate綁定,並創建適當的端點。通過Microsoft.Web.Administration命名空間查找IIs配置。

希望這會有所幫助。