1

我对 Silverlight 有点陌生,我想知道如何处理 WCF 服务的故障/处置。

我已经习惯了这样的事情(wcf abort/close 模式),你在 try/catch 中调用服务(确保你关闭或中止)。(在无状态应用程序中运行良好)

研究 Silverlight,我们在哪里应用中止/关闭模式?因为服务调用是异步的并且应用程序状态已满。

目前我唯一能想到的是某种动态代理(使用类似 Castle DP 的东西)以及来自n 层应用程序的 ChannelFactoryManager,大约在页面示例的 1/2 处。代理将确保始终有一个开放的通道,并且 ChannelFactoryManager 将处理故障

4

2 回答 2

1

由于 Silverlight 网络环境的异步特性,我建议您构建更多可测试的 ServiceAgent - 围绕 Silverlight 的客户端代理的长期单例包装器,并带有服务方法的回调。您可以在调用服务方法或使用通道故障事件之前检查真实代理状态(并在需要时重新创建)。例如:

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;
}
于 2012-11-30T19:30:04.730 回答
1

使用 Castle DP 和 ChannelFactoryManager 的解决方案在此处实现和详细说明:

http://www.codeproject.com/Articles/502121/WCF-in-a-stateful-application-WPF-Silverlight

于 2012-12-02T14:43:32.170 回答