Как определить, какая ошибка возвращается из WCF? - PullRequest
2 голосов
/ 17 марта 2011

Эй, у меня есть приложение Silverlight, которое подключается к службе WCF, и я улавливаю ошибки, используя такие аргументы событий:

private void GetContainersCompleted(object sender, GetContainersCompletedEventArgs e)
{
    if (e.Error != null)
    {
        // show some generic message
    }
    else
    {
        // process
    }
}

Как определить, что это за ошибка? услуга не работает, сеть недоступна и т. д.

Спасибо

Обновление

Меня интересуют исключения подключения и сети, вот что я в итоге сделал:

private void GetContainersCompleted(object sender, GetContainersCompletedEventArgs e)
{
    if (e.Error != null)
    {
        if (e.Error.InnerException is EndpointNotFoundException ||
            e.Error.InnerException is CommunicationException ||
            e.Error.InnerException is SecurityException)
        {
            // show connection error message
        }
        else
        {
            // show generic error message
        }
    }
    else
    {
        // process
    }
}

Есть рекомендации?

Спасибо

Ответы [ 4 ]

3 голосов
/ 17 марта 2011

Вы должны включить трассировку .NET WCF на вашем сервере в вашей среде разработки. Исключения WCF часто бесполезны. Это был единственный способ, который я нашел, чтобы отследить проблемы WCF. Особенно такие вещи, как слишком большое сообщение, циклические ссылки в контрактах данных и т. Д. Я не уверен, что вы можете включить это на уровне клиента, поскольку я не знаком с Silverlight. Хотя, если это можно сделать в SVC, то, вероятно, это можно сделать и в коде.

http://msdn.microsoft.com/en-us/library/ms733025.aspx

0 голосов
/ 18 марта 2011

Эта ссылка CP содержит точное сообщение, относящееся к вашему запросу

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

Еслимы хотим отправить дополнительную информацию вместе с нашей ошибкой, нам просто нужно создать сериализуемый класс (используя атрибут [Serializable] или [DataContract]), а затем выбросить универсальное исключение FaulException (где T - наш сериализуемый класс) и отправить нашкласс в конструктор. Чтобы клиент мог перехватить это уникальное исключение, [FaultContractAttribute (typeof (T))] (где T - наш сериализуемый класс) должен быть объявлен над контрактом операции, который может вызвать эту ошибку. Клиентский прокси, созданныйWCF прочитает заголовок ошибки в возвращаемом сообщении и попытается десериализоватьэто в обобщенную исключительную ситуацию FaultException, соответствующую типу, который мы определили в FaultContractAttribute контракта. "

0 голосов
/ 18 марта 2011

Я не уверен на 100%, относится ли это к тому, что вы спрашиваете, но ...

В службе HTTP WCF, когда вы генерируете исключение на сервере, код состояния HTTPответа 500, указывая на ошибку.В стандартном .NET-клиенте, использующем WCF, это не имеет никакого значения, но в Silverlight, работающем в браузере, это происходит - браузер частично обрабатывает ошибку (это ручное описание; я не знаю точно что происходит) и что в итоге передается в Silverlight, это общая ошибка, в которой нет никакой информации.

Способ обойти это - изменить код состояния ответапрежде чем он покинет сервер.Смотрите здесь .

0 голосов
/ 17 марта 2011

Попробуйте поместить его в блок try catch и проверить свойство InnerException исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...