4

WidnowsサービスとしてWCFをホストしていますが、WCFチャネルの障害状態の処理に問題があります。ServiceHostで障害が発生したイベントが発生することはありません。

ホスティングアプリケーション:

protected override void OnStart(string[] args)
    {
        _serviceHost = new ServiceHost(typeof(WCF_FaultTest.Service1));
        _serviceHost.Faulted += _serviceHost_Faulted;
        _serviceHost.Open();
    }

    void _serviceHost_Faulted(object sender, EventArgs e)
    {
        // never raise up..
    }

障害状態私は次のようにシミュレートしようとします:

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)]
public class Service1 : IService1
{
    public string GetFault()
    {
        throw new Exception("Should went to fault..");
    }

正しく使用していますか?ありがとうございました。

4

1 に答える 1

5

複数のCommunicationObjectを使用しています。サービス実装で例外をスローすると、チャネルに障害が発生しますが、ホストには障害が発生しません。この場合、ServiceHost.Faultedイベントは適用されません。

覚えておくべきことの1つは、CommunicationObjectが障害状態になると、使用できなくなるということです。障害が発生したCommunicationObjectを処理する唯一のことは、閉じる/中止することです。サービスが例外をスローした後でも、新しいチャネルを作成しても、サービスを呼び出すことができます。したがって、サービスに障害は発生しません。

アーキテクチャの観点からは、サービスホストイベントはエラー処理を実装するための「適切な」場所ではありません。一般に、エラー処理をサービス構成の一部にする必要があります。たとえば、ServiceHostイベントでのエラー処理は、IISホスティングに簡単に移行できません。あなたのコメントは、IErrorHandlerがあなたの要件を満たしていないように聞こえます。どのような要件を実装しようとしていますか?

于 2012-08-08T19:30:40.317 に答える