Я создал сервис WCF и клиент, и все это работает, пока это не приходит к фиксации ошибок. Конкретно я пытаюсь поймать EndpointNotFoundException
поскольку, когда сервер, оказывается, не там по любой причине. Я попробовал простой блок попытки/выгоды для фиксации определенной ошибки и коммуникационного исключения, из которого она происходит, и я попытался ловить просто Исключение. Ни один из них не преуспевает в том, чтобы ловить исключение, однако я действительно добираюсь
Первое случайное исключение типа 'Система. ServiceModel. EndpointNotFoundException' произошел в System.ServiceModel.dll
в окне вывода, когда клиент пытается открыть сервис. Какие-либо идеи относительно того, что я делаю неправильно?
Это может быть проблема с отчетом для отладчика, а не фактическая перехват исключения. этот пост дает несколько советов по решению этой проблемы, если это так ... Почему исключение .NET не перехватывается блоком try / catch?
Что такое исключение первого шанса?
Сообщения об исключении первого шанса в большинстве часто не означают, что в коде есть проблема . Для приложений / компонентов, которые обрабатывают исключения изящно, сообщения об исключении первого шанса сообщают разработчику, что возникла исключительная ситуация, которая была обработано.
Подробнее об этом читайте в этом сообщении возможное решение. Код показывает использование прокси-сервера генерации, но также действителен для 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();
}
Мне удалось воспроизвести вашу проблему, и я заинтересовался (так как мне было нужно то же самое). Я даже исследовал способ обработки \ перехвата исключений первого шанса, но, к сожалению, это невозможно (для управляемого кода) для .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
}
И тогда вы сможете поймать правильное исключение.