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