2012-11-27 47 views
1

我對Silverlight有點新,我想知道如何處理WCF服務的Faulted/Disposing。Silverlight配置WCF模式(異步)

我習慣了這樣的事情(wcf abort/close pattern),你在try/catch中調用服務(確保關閉或放棄)。 (這在無狀態應用中效果很好)

看着Silverlight,我們在哪裏應用中止/關閉模式?因爲服務調用是異步的並且應用程序狀態已滿。

目前我唯一能想到的就是某種動態代理(使用類似Castle DP的動態代理),以及來自n-tier app, about 1/2 way down the page示例的ChannelFactoryManager。代理將確保始終存在開放通道,並且ChannelFactoryManager將處理故障

回答

1

由於Silverlight網絡環境的異步特性,我建議您構建更多可測試的ServiceAgent - 圍繞Silverlight客戶端代理生存的長期單身包裝回調服務方法。在調用服務方法或使用通道Faulted事件之前,您可以檢查實際代理狀態(如果需要,可重新創建&)。對於前:

public void GetOptionsAsync(Action<GetOptionsCompletedEventArgs> callback) 
{ 
    try 
    { 
     CheckProxy(); 

     EventHandler<GetOptionsCompletedEventArgs> handler = null; 

     handler = (sender, args) => 
     { 
      Proxy.GetOptionsCompleted -= handler; 
      if (args.Error != null) 
      { 
       //... 
      } 
      if (callback != null) 
      { 
       callback(args); 
      } 
     }; 

     Proxy.GetOptionsCompleted += handler; 

     Proxy.GetOptionsAsync(); 
    } 
    catch (Exception unknownException) 
    { 
     //... 
     throw; 
    } 
} 

public override void ResetProxy() //AbortProxy/CloseProxy 
{ 
    if (Proxy != null) 
    { 
     try 
     { 
      Proxy.CloseProxy(); //extension method to handle exception while closing 
     } 
     catch (Exception unknownException) //CommunicationObjectFaultedException 
     { 
      //... 
      Proxy.Abort(); 
     }    
    } 

    CreateProxy();   
} 

public override void CheckProxy() 
{ 
    if (Proxy == null || (Proxy.State != CommunicationState.Opened && Proxy.State != CommunicationState.Created)) 
    {    
     ResetProxy(); 
    } 
} 

public override void CreateProxy() //RecreateProxy 
{   
    Proxy = new WcfClient(); 

    Proxy.InnerChannel.Faulted += OnChannelFaulted; 
} 
+0

謝謝你的輸入 - 聽起來很接近的問題代理的建議。你的解決方案如何工作,它繼承了什麼,消費者可以直接使用服務接口,開發人員是否需要爲每個服務開發一個包裝? – dbones