2009-07-05 37 views
0

我想實現一個非常基本的可靠消息狀態處理系統,以提高我的Silverlight到WCF服務器通信的可靠性。爲SilverLight實現自己設計的WCF可靠服務的問題(basicHttpBinding)

我已經採用了將自定義消息頭引入包含遞增整數作爲消息ID的SOAP請求的路由。這個想法是,當我在WCF服務器收到請求時,我想檢查消息ID。如果ID是最後一個ID,那麼我只需執行請求並在請求後,緩存結果的副本以及新ID。

如果ID是== lastID,我假設客戶端從未收到我的消息,我只想返回緩存的響應對象而不是重新處理請求。我寫了一個MessageInspector行爲對象,我注入到WCF Endpoint行爲中。這個對象實現IDispatchMessageInspector,其中有2種方法:

object IDispatchMessageInspector.AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext) 
{ 
    // Get the incoming message headers and get the messageId 
    var idx = request.Headers.FindHeader("ClientRequestId", ""); 
    if (idx >= 0) 
    { 
     var requestHeader = request.Headers[idx]; 
     int requestId = 0; 
     if (Int32.TryParse(requestHeader.ToString(), out requestId)) 
     { 
      int lastRequest = myCache.GetLastId(); 
      if (requestId <= lastRequest) 
      { 
       // @TODO - Send back the saved message 
       var reply = myCache.GetLastResponse(); 
       if (reply != null) 
       { 
        /// ERK -- > Woops, how do I override the service 
        /// and make the reply here? 
       } 
      } 
      myCache.SetLastId(requestId); 
     } 
    } 
    return null; 
} 

void IDispatchMessageInspector.BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState) 
{ 
    var requestId = myCache.GetLastId(); 
    if (requestId > 0) 
    { 
     myCache.SetLastResponse(reply); 
    } 
} 

好吧,我跑進應該是顯而易見的......的AfterReceiveRequest返回值(對象)是傳遞給BeforeSendReply爲「correlatedState」的價值問題。不是,正如我最初預計的那樣,請求的新返回值。問題是,我可以停止處理消息到該位置的服務並返回「緩存」響應嗎?

其實這個問題的更好的版本:這是適當的'注入'的位置來處理緩存和響應跟蹤?如果不是,那麼「批准ms」或更好的方式來完成這個請求跟蹤和恢復?

謝謝。

-Jeff

回答

0

經過多次的考驗和磨難之後,我找到了解決我的問題的辦法,即使不夠高雅,也是功能性的。

爲了在檢測到重複服務請求時繞過對服務端點的調用,我簡單地拋出一個FaultException。然後在BeforeSendReply的方法,我檢查看是否replay.IsFault然後如果故障是特定的故障代碼我扔在AfterReceiveRequest。如果是這樣,我返回消息響應的緩存副本。 FaultException機制是我需要用來繞過服務調用。

如果任何人想要此解決方案的完整工作代碼,請在此處放置一個註釋,然後在完成最終調試和單元測試後發佈我的最終代碼。

-Jeff

0

我認爲你想在這裏重新發明輪子。 WCF有Reliable Messaging,旨在確保消息傳遞。我會嘗試,除非這是你不想使用它的具體原因?

+0

是的,但據我所知,WCF可靠的消息不可用在silverlight中。 Silverlight只實現了basicHttpBinding,根據我的閱讀,它不支持可靠的消息傳遞。 – Jeff 2009-07-06 18:42:26