Где я могу поймать исключение EndpointNotFoundException для асинхронного вызова WCF? - PullRequest
4 голосов
/ 13 октября 2010

У меня возникли трудности с обнаружением исключения во время тестирования. Я фактически отключаю службу, чтобы конечная точка была недоступна, и я пытаюсь изменить свое приложение, чтобы справиться с такой возможностью.

Проблема в том, что независимо от того, куда я кладу блоки try / catch, я не могу поймать эту вещь, пока она не стала необработанной.

Я попытался обернуть оба моих кода создания в try / catch,

this.TopicServiceClient = new KeepTalkingServiceReference.TopicServiceClient();
            this.TopicServiceClient.GetAllTopicsCompleted += new EventHandler<KeepTalkingServiceReference.GetAllTopicsCompletedEventArgs>(TopicServiceClient_GetAllTopicsCompleted);
             this.TopicServiceClient.GetAllTopicsAsync();

а также делегат, который вызывается после завершения вызова службы.

public void TopicServiceClient_GetAllTopicsCompleted(object sender, KeepTalkingServiceReference.GetAllTopicsCompletedEventArgs e)
        {
            try
            {
...

Без кубиков. Есть мысли?

1 Ответ

2 голосов
/ 13 октября 2010

Я бы порекомендовал вам использовать IAsyncResult.Когда вы генерируете прокси WCF на клиенте и получаете асинхронные вызовы, вы должны получить метод TopicServiceClient.BeginGetAllTopics ().Этот метод возвращает объект IAsyncResult.Для завершения вызова также требуется делегат AsyncCallback.Когда он завершается, вы вызываете EndGetAllTopics (), предоставляя IASyncResult (переданный EndGetAllTopics ().

Вы помещаете попытку / ловушку вокруг вашего вызова в BeginGetAllTopics (), и это должно перехватить исключение, которое вы после.исключение происходит удаленно, т. е. вы действительно подключаетесь, но служба выдает исключение, которое обрабатывается в точке, где вы вызываете EndGetAllTopics ().

Вот действительно простой пример (явно не производственный)чтобы продемонстрировать то, что я говорю. Это было написано в WCF 4.0.

namespace WcfClient
{
class Program
{
    static IAsyncResult ar;
    static Service1Client client;
    static void Main(string[] args)
    {
        client = new Service1Client();
        try
        {
            ar = client.BeginGetData(2, new AsyncCallback(myCallback), null);
            ar.AsyncWaitHandle.WaitOne();
            ar = client.BeginGetDataUsingDataContract(null, new AsyncCallback(myCallbackContract), null);
            ar.AsyncWaitHandle.WaitOne();
        }
        catch (Exception ex1)
        {
            Console.WriteLine("{0}", ex1.Message);
        }
        Console.ReadLine();
    }
    static void myCallback(IAsyncResult arDone)
    {
        Console.WriteLine("{0}", client.EndGetData(arDone));
    }
    static void myCallbackContract(IAsyncResult arDone)
    {
        try
        {
            Console.WriteLine("{0}", client.EndGetDataUsingDataContract(arDone).ToString());
        }
        catch (Exception ex)
        {
            Console.WriteLine("{0}", ex.Message);
        }
    }
}
}

Чтобы исключение на стороне сервера распространялось обратно на клиент, вам необходимо установить следующее в веб-конфигурации сервера ...

<serviceDebug includeExceptionDetailInFaults="true"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...