【问题标题】:Silverlight Dispose pattern with WCF (Async)Silverlight Dispose 模式与 WCF(异步)
【发布时间】:2012-11-15 08:26:27
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: wcf silverlight dispose channel stateful


    【解决方案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;
    }
    

    【讨论】:

    • 感谢您的输入 - 听起来接近问题中的代理建议。你的解决方案是如何工作的,它继承了什么,消费者可以直接使用服务接口吗?开发者是否需要为每个服务开发一个包装器?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多