2011-05-22 66 views
5

我需要在Windows Azure項目中實時更改某些配置設置,並且需要通過Web服務調用更改它們(更新應用程序的配置無論是通過平臺api還是Azure管理站點都不是這裏的選項)。Azure:使用Full-IIS的WebRole通信(netTcpBinding)

該項目有多個網絡和工作者角色 - 所有這些角色在更改時都需要了解新配置。

該配置被持久化爲持久存儲,並且在運行期間它也被緩存在靜態變量中。

我的解決方案是在我的角色上創建一個內部(tcp)端點,並使用它來遍歷這些角色中的所有角色和實例,隨時創建客戶端並告訴實例有關新設置。 (幾乎相同:http://msdn.microsoft.com/en-us/gg457891

起初,我在WebRole的RoleEntryPoint中啓動了一個ServiceHost ...我很困惑爲什麼當我逐步完成通信時,一切似乎都正常工作(靜態變量的設置正確) - 但是當我做其他web服務調用時,靜態變量似乎已經「忘記」我設置的內容。

這是在本地和Azure分段環境中的情況。

此時我意識到由於我們使用的是完全IIS模式,因此RoleEntryPoint和Web服務在兩個獨立的進程中運行 - 一個在Azure的存根中,另一個在IIS中。

「沒有問題」我說過,我只需將啓動ServiceHost的代碼行從我的RoleEntryPoint移動到global.asax中 - 此時ServiceHost將以與其餘部分相同的過程啓動的網站 - 和靜態變量將是相同的。

這是我遇到問題的地方;這對我在本地機器上運行的開發環境非常有用。只要我部署到分級,我開始收到錯誤電子郵件說,用於連接到服務的渠道無法關閉,因爲它處於「故障狀態」。

問:

  • 什麼天青與導致此開發環境不同?
  • 我該如何解決或解決問題?
  • 有沒有人有任何關於如何獲得更多描述性錯誤的一般性建議......我必須在Azure中啓用完整的wcf診斷才能獲取此信息,或者是否有其他方式可以獲取異常詳細信息?

後續:

通過遠程桌面我已經學到了一些有趣的事情:

  • 非HTTP激活默認情況下未在Azure上WebRoles安裝。我相信這可以通過啓動腳本來解決:

    start/w pkgmgr/iu:WCF-NonHTTP-Activation;

  • 通過Web角色在IIS中創建的網站默認情況下未啓用net.tcp協議。我也相信這可以用一個啓動腳本來克服:

    %SYSTEMROOT%\ SYSTEM32 \ INETSRV \ Appcmd.exe的設置應用程序 「網站名稱這裏」 /enabledProtocols:https,http,net.tcp

由於截止日期迫使我暫時實施一些解決方法,我還沒有時間採取這種方式。

與該主題相關的一些有用的鏈接:

http://msdn.microsoft.com/en-us/magazine/cc163357.aspx

http://forums.iis.net/t/1160443.aspx

http://msdn.microsoft.com/en-us/library/ms731053.aspx

http://labs.episerver.com/en/Blogs/Paul-Smith/Dates/2008/6/Hosting-non-HTTP-based-WCF-applications-in-IIS7/

+0

我不知道這個問題的解決方案是什麼,但我遇到了非常類似的東西:http://stackoverflow.com/questions/5956814/unable-to-host-a-service-bus- wcf-host-in-iis-on-azure – knightpfhor 2011-05-22 10:13:02

回答

1

UPDATE(6/27/2011):

令人驚訝的是,有人在微軟(其博客我評論了)居然讓我在這一個答案。

Azure的& WCF團隊更新這個帖子:

http://blogs.msdn.com/b/windowsazure/archive/2011/06/27/hosting-services-with-was-and-iis-on-windows-azure.aspx

鏈接包含了所有的信息,你需要得到這個打算。

並且非常感謝Yavor Georgiev,MSFT PM的勝利。


它已經相當一段時間,因爲我問過的問題,並沒有答案,所以讓我離開這個:

每在後我的隨訪中,有使這項工作的方法...但它們很複雜,難以實施。

對於工作者角色,netTcpBinding完美工作。這裏沒有問題。繼續使用它。

對於WEB ROLES,你有問題。但netTcpBinding是你需要用來暴露內部端點的東西。該怎麼辦?

嗯,這裏是我所做的:使用的ServiceHost

  • 在RoleEntryPoint開始NetTcpBinding的服務。
  • 使用SOAP/JSON /無論您想要什麼,都可以在您的Web角色中創建標準的WCF服務。
  • 當您通過netTcpBinding接收到請求時,將它們代理到回送適配器上的WCF服務。
  • 正確使用SSL客戶端證書保護您的「內部」WCF服務。

這不是完美的......但它的工作原理,它並不可怕。

我懷疑需要做這種事情並不是很常見,我真的想不出任何理由爲什麼除了在運行時動態修改設置之外,您還需要什麼...這意味着您不會像瘋了一樣抨擊這些服務。

顯然,YMMV。

0

我有一個悲慘的時間越來越HTTP在分期實例之間的合作,並當它看起來像我需要混亂時放棄與netsh在一起,讓我的進程有權通過HttpListener(sheesh!)進行監聽。所以我通過套接字切換到TCP。 HTTP只是增加了像這樣的點對點通信場景的開銷。

+0

也許我很困惑。我使用netTcpBinding ...不是HTTP。你說你「通過套接字切換到TCP」......你能舉一個例子說明你如何做到這一點,並讓ServiceHost與你運行的IIS託管的.NET應用程序進行交互? – Steve 2011-05-23 00:09:01

+0

我可能應該將我的答案作爲評論發佈,因爲實際上我只是想分享角色之間的溝通方式。我在Global.asax.cs中的Application_Start中啓動一個線程。它使用底層套接字API接收來自輔助角色的消息,該角色也使用低級套接字API。也就是說,也許不要嘗試使用WCF。 – 2011-05-31 07:22:04