使用WCF(异步)的Silverlight Dispose模式

时间:2012-11-27 16:43:43

标签: wcf silverlight dispose channel stateful

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

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

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

目前,我唯一能想到的是某种动态代理(使用类似Castle DP的东西)以及n-tier app, about 1/2 way down the page示例中的ChannelFactoryManager。代理将确保始终存在开放通道,ChannelFactoryManager将处理故障

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

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

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