2009-07-16 10 views
7

未処理の例外によってWCFサービスがクラッシュするかどうかを知りたい。私はWCFサービスによって開始されたスレッドで未処理の例外がWCFサービス全体をクラッシュさせることを示す次のプログラムを書いています。未処理の例外により、WCFサービスがクラッシュすることがありますか?

私の質問は、(WCFサービスによって開始された)スレッドの未処理の例外がWCFをクラッシュさせるかどうかを確認したいのですが?私の混乱は、WCFが処理されない例外のためにクラッシュすべきでない安定したサービスであるべきだと私は思う。

私は、VSTS 2008 + C#+ .Net 3.5を使用して、WCFサービスに基づく自己ホストWindowsサービスを開発しています。ここ

namespace Foo 
{ 
    // NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in Web.config. 
    [ServiceContract] 
    public interface IFoo 
    { 
     [OperationContract] 
     string Submit(string request); 
    } 
} 

namespace Foo 
{ 
    // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in Web.config and in the associated .svc file. 
    public class FooImpl : IFoo 
    { 
     public string Submit(string request) 
     { 
      return String.Empty; 
     } 
    } 
} 

namespace Foo 
{ 
    public partial class Service1 : ServiceBase 
    { 
     public Service1() 
     { 
      InitializeComponent(); 
     } 

     ServiceHost host = new ServiceHost(typeof(FooImpl)); 

     protected override void OnStart(string[] args) 
     { 
      host.Open(); 
      // start a thread which will throw unhandled exception 
      Thread t = new Thread(Workerjob); 
      t.Start(); 
     } 

     protected override void OnStop() 
     { 
      host.Close(); 
     } 

     public static void Workerjob() 
     { 
      Thread.Sleep(5000); 
      throw new Exception("unhandled"); 
     } 
    } 
} 
+2

この例では、「WCFサービスによって開始されたスレッドで未処理の例外」が表示されていませんが、「Windowsサービスによって開始されたスレッドで未処理の例外」が表示されます。それはWCFとは関係ありません。 –

+0

Windowsサービス(host.Open())でWCF自己ホストを開始します.WCFサービスで処理されない例外が発生しています。混乱を招く言葉や、私の質問に対するコメントや答えをお詫び申し上げます。 – George2

答えて

11

、コードの関連部分であるはい、スレッド内の未処理の例外処理をダウンかかります。

このプロセスがクラッシュします:

static void Main(string[] args) 
{ 
    Thread t = new Thread(() => 
    { 
     throw new NullReferenceException(); 
    }); 
    t.Start(); 
    Console.ReadKey(); 
} 

をこの1つはありません:あなたはそれがオペレーティングシステムに渡される例外を処理しない

static void Main(string[] args) 
{ 
    Thread t = new Thread(() => 
    { 
     try 
     { 
      throw new NullReferenceException(); 
     } 
     catch (Exception exception) 
     { 
      Console.WriteLine(exception.ToString()); 
     } 
    }); 
    t.Start(); 
    Console.ReadKey(); 
} 
+0

ありがとうございました。 – George2

3

場合は、それが何を殺すことによって応答しますこれまでのアプリケーションで例外が発生しました。

try/catchを追加するだけで、サービスが強制終了されないように例外を処理するのはなぜですか?

+0

メインスレッド以外のスレッドで例外が発生していない場合。上記のFredrikMörkの例を参照してください。 – user141682

+0

Fredrikの例では、例外を止めてプロセスを停止させるtry/catchブロックがあります。 – jussij

1

エラー処理が適切でないと、プログラムがクラッシュする可能性があります。

try{//do something 
} 
catch{ //handle errors 
} 
finally{//final clean up 
} 

ブロックをコードに入れて、例外がスローされた場合は正常に処理するようにしてください。例:http://msdn.microsoft.com/en-us/library/fk6t46tz(VS.71).aspx

17

サービス側で未処理の例外が発生すると、チャネル(クライアントとサーバー間の接続)が「障害」になります。解体される。

以降、同じプロキシクライアントオブジェクトインスタンスを使用してクライアントから呼び出すことはできません。プロキシクライアントを再作成する必要があります。

可能な限り、サーバー側のすべてのエラーを処理することをお勧めします。すべての未処理の.NET例外をSOAP障害(NOT)に変更するか、またはそれらを完全に報告/呑み込むために、サービス実装クラスで実装する必要があるIErrorHandlerインターフェイスを確認してください。

マルク・

+0

こんにちはマーク、私は注意深くIErrorHandlerに関するあなたの推奨MSDNリンクを読んでいます。 1つの混乱、私の問題の未処理の例外は、自分自身がexplciitlyで起動したスレッドからであり、WCF操作スレッドではありません。私はIErrorHandlerがWCF操作スレッド(つまりOperationContract操作を実行するスレッド)で未処理の例外を捕捉し、スレッドがWCF操作スレッドではないので、それは私の問題には関係していないと思いますか?コメントはありますか? – George2

+1

WCFサーバーコードからそのスレッドを開始しましたか?実際には、あなたのスレッドがサーバーコードに影響を与えます。サーバーコードで例外が発生した場合は、IErrorHandlerインターフェイスを実装すると役立ちます。 –

+0

Marcさん、ありがとうございます1.私は "あなたのWCFサーバーコードからそのスレッドを開始する"という意味について混乱しています。開発者の視点から見たWCFは単なる契約のセットですが、私はWCFサーバーがどういう意味なのかよくわかりません。 :-) 2. WCF以外のスレッドからの未処理例外もIErrorHandlerによって捕捉されますか? – George2

7

WCFランタイムのデフォルトの動作は、いくつかの種類の例外が、すべてを飲み込むことです。だから、あなたのコードが(WCF操作から投げた場合など)WCFランタイムにスタックの例外をスローすると、OOM、SEHExceptionなどのような "致命的な"例外とみなされない限り、アプリケーションはクラッシュしません)。例外がオペレーションのフォールトコントラクトの一部でない場合、チャネルはフォールトされ、そうでない場合はフォールトされます。

スタック上のコードの下にWCFランタイムが存在しない場合、例外は/ will/theプロセスをクラッシュします。

これはASP.NETランタイムに似ています。

一般的な方法でWCF操作から飛び出した例外を選別する場合は、IOperationInvokerインターフェイスの使用をお勧めします。 IErrorHandlerを使用することもできますが、IErrorHandlerの実装には、WCF内部I/OスレッドのSocketAbortedExceptionsなど、「ユーザーコード」(WCF操作)からスローされた例外以外の例外が通知されます。

1

FaultExceptionを使用して、エラーをクライアント側に伝え、ロジックをサービスに保持することができます。

これを確認してくださいexample、あなたを助けてくれることを願っています。

関連する問題