WCF/C#, Не могущий поймать EndpointNotFoundException

Я создал сервис WCF и клиент, и все это работает, пока это не приходит к фиксации ошибок. Конкретно я пытаюсь поймать EndpointNotFoundException поскольку, когда сервер, оказывается, не там по любой причине. Я попробовал простой блок попытки/выгоды для фиксации определенной ошибки и коммуникационного исключения, из которого она происходит, и я попытался ловить просто Исключение. Ни один из них не преуспевает в том, чтобы ловить исключение, однако я действительно добираюсь

Первое случайное исключение типа 'Система. ServiceModel. EndpointNotFoundException' произошел в System.ServiceModel.dll

в окне вывода, когда клиент пытается открыть сервис. Какие-либо идеи относительно того, что я делаю неправильно?

18
задан Community 1 April 2016 в 13:42
поделиться

4 ответа

Это может быть проблема с отчетом для отладчика, а не фактическая перехват исключения. этот пост дает несколько советов по решению этой проблемы, если это так ... Почему исключение .NET не перехватывается блоком try / catch?

1
ответ дан 30 November 2019 в 09:36
поделиться

Что такое исключение первого шанса?

Сообщения об исключении первого шанса в большинстве часто не означают, что в коде есть проблема . Для приложений / компонентов, которые обрабатывают исключения изящно, сообщения об исключении первого шанса сообщают разработчику, что возникла исключительная ситуация, которая была обработано.

0
ответ дан 30 November 2019 в 09:36
поделиться

Подробнее об этом читайте в этом сообщении возможное решение. Код показывает использование прокси-сервера генерации, но также действителен для ChannelFactory и других.

Типичный шаблон "здесь-быть-драконы"

using (WCFServiceClient c = new WCFServiceClient())
{
    try
    {
        c.HelloWorld();
    }
    catch (Exception ex)
    {
        // You don't know it yet but your mellow has just been harshed.

        // If you handle this exception and fall through you will still be cheerfully greeted with 
        // an unhandled CommunicationObjectFaultedException when 'using' tries to .Close() the client.

        // If you throw or re-throw from here you will never see that exception, it is gone forever. 
        // buh bye.
        // All you will get is an unhandled CommunicationObjectFaultedException
    }
} // <-- here is where the CommunicationObjectFaultedException is thrown

Правильный шаблон:

using (WCFServiceClient client = new WCFServiceClient())
{
    try
    {
        client.ThrowException();

    }
    catch (Exception ex)
    {
        // acknowledge the Faulted state and allow transition to Closed
        client.Abort();

        // handle the exception or rethrow, makes no nevermind to me, my
        // yob is done ;-D
    }
} 

Или, как указано в вашем вопросе без оператора using,

WCFServiceClient c = new WCFServiceClient();

try
{
    c.HelloWorld();
}
catch
{
    // acknowledge the Faulted state and allow transition to Closed
    c.Abort();

    // handle or throw
    throw;
}
finally
{
    c.Close();
}
3
ответ дан 30 November 2019 в 09:36
поделиться

Мне удалось воспроизвести вашу проблему, и я заинтересовался (так как мне было нужно то же самое). Я даже исследовал способ обработки \ перехвата исключений первого шанса, но, к сожалению, это невозможно (для управляемого кода) для .net framework 3.5 и ниже.

В моем случае я всегда получаю System.ServiceModel.CommunicationObjectFaaledException всякий раз, когда что-то не так с сервисом или когда я обращаюсь к неработающему сервису. Оказывается, причиной является оператор C # using , поскольку за кулисами оператор using всегда закрывает экземпляр клиента службы, даже если исключение уже было обнаружено (оно не переходит к оператор catch напрямую).

Произошло то, что исходное исключение System.ServiceModel.EndpointNotFoundException будет заменено новым исключением System.ServiceModel.CommunicationObjectFaaledException всякий раз, когда с помощью пытается выполнить закройте экземпляр клиента службы.

Решение, которое я сделал, состоит в том, чтобы не использовать оператор using , чтобы всякий раз, когда возникает исключение внутри блока try, он немедленно генерирует исключение для блоков catch.

Попробуйте написать что-нибудь вроде:

DashboardService.DashboardServiceClient svc = new Dashboard_WPF_Test.DashboardService.DashboardServiceClient();
try
{
    svc.GetChart(0);
}
catch (System.ServiceModel.EndpointNotFoundException ex)
{
    //handle endpoint not found exception here
}
catch (Exception ex)
{
    //general exception handler
}
finally
{
    if (!svc.State.Equals(System.ServiceModel.CommunicationState.Faulted) && svc.State.Equals(System.ServiceModel.CommunicationState.Opened))
    svc.Close();
}

Вместо:

try
{
    using (DashboardService.DashboardServiceClient svc = new Dashboard_WPF_Test.DashboardService.DashboardServiceClient())
    {
        svc.GetChart(0);
    }
}
catch (System.ServiceModel.EndpointNotFoundException ex)
{
    //handle endpoint not found exception here (I was never able to catch this type of exception using the using statement block)
}
catch (Exception ex)
{
    //general exception handler
}

И тогда вы сможете поймать правильное исключение.

4
ответ дан 30 November 2019 в 09:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: