1

私はSilverlightに少し慣れていないので、WCFサービスの障害/破棄に対処する方法を知りたいです。

私は、try / catchでサービスを呼び出す(必ず閉じるか中止する)このようなもの( wcf abort / close pattern )に慣れています。(ステートレスアプリケーションでうまく機能します)

Silverlightを調べて、中止/クローズパターンをどこに適用しますか?サービス呼び出しは非同期であり、アプリケーションは状態がいっぱいであるためです。

現時点で私が考えることができるのは、ページの例の約1/2のところにある、n層アプリのChannelFactoryManagerを伴うある種の動的プロキシ(Castle DPなどを使用)です。ここで、プロキシは常に開いているチャネルが存在することを確認し、ChannelFactoryManagerが障害を処理します

4

2 に答える 2

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

ChannelFactoryManagerが実装され、ここで詳細に説明されているCastleDPを使用するソリューション:

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

于 2012-12-02T14:43:32.170 に答える