Обработка исключений конечной точки в WCF - PullRequest
0 голосов
/ 12 декабря 2011

в моем приложении (Windows Phone) я динамически генерирую соединение с веб-службой WCF с помощью кода позади. Пользователь должен указать URL-адрес веб-службы, затем я создаю свой EndPointAddress и Binding, и он работает хорошо. Но если пользователь вводит неверный URL, возникает исключение:

"System.ServiceModel.EndpointNotFoundException -> Не было конечной точки, прослушивающей [адрес службы], который мог бы принять сообщение. Это часто вызывается неверным адресом или действием SOAP. Для получения дополнительной информации см. InnerException, если имеется, . "

Необычное исключение довольно классическое: «Удаленный сервер возвратил ошибку: Не найдено при InnerException.»

Проблема: я не могу обработать это исключение. Я попробовал многие вещи, найденные здесь, но безуспешно.

Есть ли решение?

Единственное, что я смог найти, - это отменить некоторые методы в Reference.cs, что, безусловно, не очень хорошая идея ...!

Заранее спасибо и извините за мой плохой английский :)!

Мой настоящий код выглядит так, но он не улавливает исключение =>

        MyServiceClient client = new MyServiceClient(myBinding, myEndpointAddress);
        try
        {
            client.RegisterUserCompleted += new EventHandler<RegisterUserCompletedEventArgs>(client_RegisterUserCompleted);
            client.RegisterUserAsync();
        }
        catch (TimeoutException ex)
        {
            MessageBox.Show(ex.Message);
            client.Abort();
        }

        catch (FaultException ex)
        {
            MessageBox.Show(ex.Message);
            client.Abort();
        }

        catch (CommunicationException ex)
        {
            MessageBox.Show(ex.Message);
            client.Abort();
        }

        catch
        {
            MessageBox.Show("Error");
            client.Abort();
        }
        finally
        {
            client.CloseAsync();
        }

Ответы [ 2 ]

2 голосов
/ 19 декабря 2011

проблема решена.Решение заключается в следующем: URI должны быть проверены перед созданием клиента.Для этого я делаю WebRequest и ловлю исключение в WebResponse:

public void ValidateUri(String uri)
    {
        if (!Uri.IsWellFormedUriString(uri, UriKind.RelativeOrAbsolute)) return;
        request = WebRequest.Create(uri);
        request.BeginGetResponse(new AsyncCallback(ValidateUriCallback), null);
    }

    private WebRequest request;
    private void ValidateUriCallback(IAsyncResult result)
    {
        try
        {
            WebResponse httpResponse = (WebResponse)request.EndGetResponse(result);

            // Create the client here
            ServiceClient client = new MyServiceClient(myBinding, myEndpointAddress);
        client.RegisterUserCompleted += new EventHandler<RegisterUserCompletedEventArgs>(client_RegisterUserCompleted);
        client.RegisterUserAsync();

        }
        catch (WebException ex)
        {
            var response = ex.Response as System.Net.HttpWebResponse;
    if (response!=null 
        && response.StatusCode == HttpStatusCode.NotFound)
    {
        Dispatcher.BeginInvoke(delegate()
                {
                    MessageBox.Show("The web service address is not valid", "Sorry", MessageBoxButton.OK);
                 });
    }
        }
0 голосов
/ 12 декабря 2011

Вам нужно переместить свои попытки уловки в метод client_RegisterUserCompleted и обернуть вокруг var x = e.Result;

РЕДАКТИРОВАТЬ: Так как мой первый подход был неправильным ... Сначала вы должны проверить свой URL (myEndpointAddress в вашем коде). Можете ли вы перейти к нему в браузере (вы можете установить точку останова в этой строке, затем скопировать значение и вставить его в свой браузер).

Если это работает или если при просмотре отображается ошибка, добавьте ее в ваш web.config веб-приложения, в котором размещена служба WCF внутри

<system.diagnostics> <sources> <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true"> <listeners> <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData= "Trace.svclog" /> </listeners> </source> </sources> </system.diagnostics>

Затем запустите ваше приложение или перейдите к нему. Он создаст файл Trace.svclog в том же каталоге, что и ваше веб-приложение. Откройте этот файл и найдите выделенную красным цветом запись. Это даст вам больше информации об исключении. WCF не возвращает полную информацию по умолчанию, чтобы замедлить работу злоумышленников.

...