Я смог повторить вашу проблему и заинтересовался (так как мне нужно было то же самое). Я даже исследовал способ обработки \ перехвата исключений первого шанса, но, к сожалению, это невозможно (для управляемого кода) для .net framework 3.5 и ниже.
В моем случае я всегда получаю System.ServiceModel.CommunicationObjectFaultedException
всякий раз, когда что-то не так в сервисе или когда я получаю доступ к неработающей услуге. Оказывается, причиной является оператор c # using
, поскольку за сценой оператор using
всегда закрывает экземпляр клиента службы, даже если исключение уже встречалось (это не не прыгайте, чтобы поймать заявление напрямую).
В результате исходное исключение System.ServiceModel.EndpointNotFoundException
будет заменено новым исключением System.ServiceModel.CommunicationObjectFaultedException
всякий раз, когда using
пытается закрыть экземпляр клиента службы.
Решение, которое я принял, состоит в том, чтобы не использовать оператор 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
}
И тогда вы сможете поймать правильное исключение.