Передача объекта исключения в веб-сервис - PullRequest
5 голосов
/ 10 июля 2009

Исходя из вопроса здесь заставило меня задуматься ....

Возможно ли, что / когда приложение встречает необработанное исключение для этого объекта исключения, который будет сериализован и отправлен в веб-службу с бэкэндом БД. Затем, используя утилиту или даже в Visual Studio, объект исключения может быть загружен из БД и проверен ??

Это вообще возможно? Я предполагаю, что первый вопрос заключается в том, можете ли вы сериализовать объекты исключений.

Ответы [ 5 ]

3 голосов
/ 10 июля 2009

Вы можете сериализовать объекты исключений. Фактически это необходимо для передачи объекта исключения с сервера на клиент в случае возникновения исключения в вызове веб-службы. Вот почему System.Exception имеет перегрузку конструктора , которая создает объект исключения из сериализованных данных .

Пример кода для сериализации / десериализации объекта исключения:

private static void SerializeException(Exception ex, Stream stream)
{
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(stream, ex);
}

private static Exception DeserializeException(Stream stream)
{
    BinaryFormatter formatter = new BinaryFormatter();
    return (Exception)formatter.Deserialize(stream);
}

// demo code
using (Stream memoryStream = new MemoryStream())
{
    try
    {
        throw new NullReferenceException();
    }
    catch (Exception ex)
    {
        // serialize exception object to stream
        SerializeException(ex, memoryStream);
        memoryStream.Position = 0;
    }
    // create exception object from stream, and print details to the console
    Console.WriteLine(DeserializeException(memoryStream).ToString());
}

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

1 голос
/ 10 июля 2009

Ну, есть несколько способов приблизиться к этому. В прошлом я просто делал то, что я бы назвал сверхнаивной XML-сериализацией, которая сменилась чем-то вроде

<exception>
    <type></type>
    <Message></Message>
    <StackTrace></StackTrace>
    <innerException></innerException> //this would have the same schema as the root exception
</exception

и просто передайте это. Мне не нужно было десериализовать это для того, что я делал. Я просто регистрировал техническую часть и отображал сообщение пользователю, когда веб-служба не работала.

Другой вариант - просто выполнить двоичную сериализацию в таблицу базы данных, передать ключ к этой таблице по проводам и повторно скопировать исключение из двоичного файла из базы данных.

1 голос
/ 10 июля 2009

Используя WCF, это было бы легкой задачей. Реализуйте пользовательский IErrorHandler для отправки ошибок в службу ведения журнала. Класс FaultException используется WCF для сообщения об ошибках в формате SOAP XML и может быть отправлен непосредственно в службу ведения журнала.

0 голосов
/ 10 июля 2009

Да, это возможно, в случае, если ваше программное обеспечение находится на удаленном сайте, вы можете регистрировать его локально и периодически отправлять обратно на «материнский корабль» через веб-сервис.

Это довольно эффективный способ сбора информации о необработанных исключениях в дикой природе и их разрешения.

Если вы собираете трассировку стека, она обычно достаточно хороша, чтобы дать вам подсказку, в чем проблема. Однако в сборках релиза вы не получите номеров строк.

0 голосов
/ 10 июля 2009

Это не обязательно. Просто зарегистрируйте исключение.

Если вы хотите зарегистрировать его в базе данных, продолжайте. Для этого вы можете использовать блок приложения ведения журналов Enterprise Library.

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