2012-10-12 48 views
7

我有以下設置從WCF服務將數據發送到一個網站

  • 一個jQuery的網站(不完全是單頁,而不是遠離它),它使用
  • 一個ASP.NET MVC網站作爲後端,它通過連接(通過net.tcp或net.pipe)到
  • 一個自託管的WCF服務,管理和連接到
  • 大量的高延遲外部服務。

因此,當一個客戶端按下按鈕,請求被髮送到MVC,其路由到WCF,它彙集它從外部的服務,一切都很好,很正常。

這個問題我似乎無法籠絡我的頭腦,就是以另一種方式進行溝通,即當其中一個外部服務脫機時,通知客戶端(瀏覽器)的最簡單最優雅的方式是什麼?

這意味着該服務應該以某種方式通知mvc站點應該以某種方式通知客戶端外部服務處於脫機狀態。

此外:外部服務將具有高可用性,因此「脫機」方案很少使用,因此我正在尋找一種不會廣泛查詢服務器的解決方案。

+0

你如何定義「離線」?暫時無法訪問?由外部服務的管理員關閉以進行維護?這是嚴格處理「計劃中的」中斷還是您希望優雅地處理無法聯繫遠程服務? –

+0

@RickLiddle「變黑」在這裏可能是一個更好的詞。基本上,當外部服務(這是我的命令以外)沒有響應,因爲它應該。 – SWeko

+0

我強烈推薦JcFx [下方]提供的SignalR建議(http://stackoverflow.com/a/12863194/35241)。 –

回答

4

我正在研究類似的體系結構,並計劃使用SignalR將更新從WCF(有時直接,有時是通過Azure Service Bus)推送到單頁面jQuery驅動的應用程序。不過,我還沒有實現,所以可能有一些我沒有考慮過的問題。

從自己的文件:

從服務器將數據推送到客戶端(而不僅僅是瀏覽器客戶端) 一直是一個棘手的問題。 SignalR讓它變得簡單, 爲您處理所有繁重的工作。

斯科特Hansleman對題目有好的博客:http://www.hanselman.com/blog/AsynchronousScalableWebApplicationsWithRealtimePersistentLongrunningConnectionsWithSignalR.aspx

+0

Upvoted - 卓越的解決方案,可爲手頭的問題提供可行的答案,幷包含豐富的資源。這就是IMO,StackOverflow上的答案應該是什麼模型。 –

1

您可以使用fault exceptions將異常數據返回給客戶端。

我更喜歡在返回的合同上使用IsSuccessful標誌,並且在發生嚴重錯誤時只拋出錯誤異常。

下面是一個與IsSuccessful標誌的響應合同的基本示例。

[DataContract] 
public class MyResponse 
{ 
    [DataMember] 
    public bool IsSuccessful { get { return Message == null || !Messages.Any(); } set { } } 
    [DataMember] 
    public List<string> Messages { get; set; } 
} 

Messages如果您需要提供更詳細的信息,可以是複雜的類型。如果更適合您的架構,則DataContractDataMember屬性可以是MessageContractMessageBodyMember

+0

是不是簡單Json更容易? – lboshuizen

+0

我可能沒有說清楚問題,對不起。沒有來自客戶端的請求,服務器應該發起通信。 – SWeko

0

WCF和瀏覽器的典型場景是請求/響應模式。瀏覽器發出請求並且服務響應。

您可以讓瀏覽器定期輪詢服務以查找狀態。

+0

外部服務將具有高可用性,因此「脫機」方案很少使用,因此我正在尋找一種不會廣泛查詢服務器的解決方案。 – SWeko

+0

在這種情況下,僅當外部服務處於脫機狀態並且瀏覽器發出請求時才返回故障。 –

+0

我已經這樣做了,但現在我需要主動通知:) – SWeko

1

聽起來對我來說,您需要在輪詢服務中實現某種類型的功能,以便爲這些外部服務提供可用性。

+0

這已經在WCF服務級別上實現了,並且可以根據客戶端的要求提供。問題是現在我需要以事件驅動的方式將它發送給客戶端。 – SWeko

+0

客戶端是什麼?這是基於網絡的嗎? – mojo722

+0

是的,我描述過這樣的問題。 – SWeko

相關問題