WCF ChannelFactory не точно сообщает о неисправном состоянии? - PullRequest
3 голосов
/ 03 марта 2012

Я использую ChannelFactory для открытия / управления каналами WCF (по сравнению с прокси-сервером клиента).Однако, когда возникает исключение, заводское состояние не сообщает, что канал неисправен ...

        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();

Iожидал, что фабричное состояние вернуло CommunicationState.Faults в блоке catch (...).

В конце я ищу способ точно получить состояние канала при использовании ChannelFactory и ClientProxy, потому что я хочу сохранить состояние сеанса, если это возможно;и не циклично весь сеанс, если действительный FaultContact проходит через ...

Когда действительный FaultContact активирован, канал все еще действителен, и я могу продолжать использовать его, как и ожидалось.НО, когда не-FaultContract поднят, канал не может использоваться и должен быть зациклен.Однако в обоих случаях свойство .State возвращает CommunicationState.Open, поэтому нет точного способа определить, должен ли канал быть зациклен или нет ...

После того, как будет создан не FaultContract, в будущемзвонки через канал поднять «канал неисправен» ошибка даже в то время как свойство .State упорно сообщает канал находится в открытом состоянии.

Спасибо заранее за любой ввод / идеи / указатели / мысль,

Т

1 Ответ

6 голосов
/ 03 марта 2012

Полагаю, вам нужно проверить состояние канала , а не заводское.Вы можете сделать это, приведя канал к 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;
}
...