Сериализация типов MethodBase и Exception в WebMethod - PullRequest
0 голосов
/ 08 ноября 2010

Мы пытаемся создать простой в использовании веб-сервис для регистрации исключений и сообщений.

В идеале объявление веб-методов должно выглядеть следующим образом

public int LogException(MethodBase methodBase, Exception exception)
public int LogMessage(MethodBase methodBase, string message, string data)

Но это не работает, так как при добавлении ссылки на веб-сервис он создает свои собственные классы, и System.Reflection.MethodBase отличается от типа LogService.MethodBase. И ни MethodBase, ни Exception не сериализуются. И я также хочу, чтобы исключение имело свои значения данных.

Как бы вы передали эти два объекта веб-методу?

Причина, по которой мы надеялись передать эти два объекта, заключается в том, что между ними мы можем получить 99% данных, необходимых для отслеживания ошибки. Они содержат информацию трассировки стека, имена методов и класс, в котором они находятся, и т. Д. И т. Д. И, добавив некоторую информацию в Exception.Data, вы можете получить значения параметров во время вызова. И это упрощает вызов для других разработчиков и, мы надеемся, делает их более вероятными, чтобы использовать общий регистратор, а не всегда катиться самостоятельно. Что в настоящее время оказывается проблематичным, поскольку каждый регистратор отличается, и большинство из них, похоже, не содержат ВСЕХ деталей, необходимых для отслеживания ошибки.

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

1 Ответ

4 голосов
/ 08 ноября 2010

Пожалуйста, не делайте этого.

Вы не должны использовать веб-сервисы для передачи специфичных для платформы данных. MethodBase и т. Д. Относятся к .NET, и инфраструктура веб-службы не предназначена для этого.

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

Наконец, если вам нужно сделать это, не используйте для этого веб-сервисы ASMX - используйте WCF, что позволит вам использовать один и тот же тип как для клиента, так и для службы.

Возможно, что еще важнее, WCF позволит вам использовать MSMQ в качестве транспорта, чтобы вы могли использовать надежные очереди, чтобы гарантировать, что ваши сообщения журнала в конечном итоге будут регистрироваться.

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

...