2012-03-02 21 views
3

私はChannelFactoryを使用してWCFチャネルをオープン/管理しています(対クライアントプロキシ)。例外が発生したときただし、工場出荷時の状態は...チャンネルに障害が発生していることを報告しませんWCF ChannelFactoryがFaulted状態を正確に報告していませんか?

 ChannelFactory<IContract> factory 
        = new ChannelFactory<IContract>("NetTcpBinding_IContract", 
                new EndpointAddress("net.tcp://localhost:8509/WCFSvc")); 

     try 
     { 
      IContract contrct = factory.CreateChannel(); 
      contrct.DoWork(); //throws a non-FaultContract<ExceptionDetail>() exception 
      factory.Close(); 
     } 
     catch (Exception) 
     { 
      CommunicationState s = factory.State; //returns CommunicationState.Opened 
     } 
IContract.DoWorkは()のように見える

:私はことを期待しているだろう

[FaultContract(typeof(ExceptionDetail))] 
    void DoWork(); 

ファクトリステートはcatch(...)ブロックにCommunicationState.Faultedを返しました。

最後に、ChannelFactoryとClientProxyを使用しているときに、正確にチャネル状態を取得する方法を探しています。可能であれば、セッション状態を保持したいと思っています。そしてないサイクル合法FaultContact <ExceptionDetail>が上昇した合法的なFaultContact <ExceptionDetail>が伝わってくる場合は、セッション全体...

は、チャネルは、予想通り、私はそれを使用し続けることができ、まだ&有効です。ただし、FaultContract以外の<ExceptionDetail>が発生した場合、チャネルは使用できず、再起動する必要があります。しかし、どちらの場合も、.StateプロパティはCommunicationState.Openを返しているので、チャネルを循環させるべきかどうかを判断する良い方法はありません。

FaultContract以外のものがスローされると、 .StateプロパティがチャネルがOpened状態になっていると忠実に報告している間でも、チャネルは "the channel is faulted"エラーを発生させます。任意の入力/アイデア/ポインタ/思考を事前に

おかげで、

T

+0

あなたは非FaultContractに「非」と正確に何を意味するのですか? –

+0

は、DoWorkがFaultContract ()ではない例外をスローすることを意味します(例えば、ApplicationExceptionをスローします) – TOB

答えて

6

私はあなたがチャンネル、ない工場の状態を確認する必要があると考えています。これを行うには、チャンネルをICommunicationObjectにキャストします。このチャンネルはチャンネルと工場の両方に実装されています。このような

何か:

ChannelFactory<IContract> factory 
       = new ChannelFactory<IContract>("NetTcpBinding_IContract", 
               new EndpointAddress("net.tcp://localhost:8509/WCFSvc")); 

IContract contrct; 

try 
{ 
    contrct = factory.CreateChannel(); 
    contrct.DoWork(); //throws a non-FaultContract<ExceptionDetail>() exception 
    factory.Close(); 
} 
catch (Exception) 
{ 
    //CommunicationState s = factory.State; //returns CommunicationState.Opened 
    CommunicationState s = ((ICommunicationObject)contrct).State; 
} 
+0

これはまっすぐなものだったと期待していました。 – TOB

関連する問題