Расширение.NET SOAP создает исключение NullReferenceException внутри MethodInfo?
ПРИМЕЧАНИЕ. Использование.NET 2.0 и VS2005 в качестве IDE
Всем привет,
Я работаю над регистрацией вызовов веб-сервисов в нашей базе данных и, наконец, настроил и запустил SoapExtension, используя очень урезанную реализацию, перенесенную из другого проекта. Я настроил его в файле конфигурации, чтобы он работал для всех методов. Когда я вызываю свой веб-сервис и запускается расширение мыла, возникает исключение NullPointerException, когда SoapServerMessage пытается вызвать его свойство MethodInfo:
System.Web.Services.Protocols.SoapException: There was an exception running the extensions specified in the config file.
---> System.NullReferenceException: Object reference not set to an instance of an object.
at System.Web.Services.Protocols.SoapServerProtocol.get_MethodInfo()
at System.Web.Services.Protocols.SoapServerMessage.get_MethodInfo()
at MyService.SOAPLoggingExtension.LogInput(SoapMessage message)
at MyService.SOAPLoggingExtension.ProcessMessage(SoapMessage message)
at System.Web.Services.Protocols.SoapMessage.RunExtensions(SoapExtension[] extensions, Boolean throwOnException)
at System.Web.Services.Protocols.SoapServerProtocol.Initialize()
--- End of inner exception stack trace ---
at System.Web.Services.Protocols.SoapServerProtocol.Initialize()
at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing)
Метод LogInput вызывается на этапе BeforeDeserialize ProcessMessage(SoapMessage):
SoapMessageStage.BeforeDeserialize:
CopyStream(_oldStream, _newStream);
_newStream.Position = 0;
if(_enabled)
LogInput(message);
break;
И метод LogInput не выполняется при попытке доступа к свойству MethodInfo объекта сообщения, которое он пытается записать в журнал. Вот блок кода, где вызывается свойство:
entry = new MyServerLogEntry();
entry.ServerURL = message.Url;
entry.Method = (message.MethodInfo == null) ? null : message.MethodInfo.Name;
Когда вызывается message.MethodInfo, он переходит к SoapServerProtocol.get_MethodInfo(), и там создается исключение нулевой ссылки. Я гуглил и проверял здесь переполнение стека, но не смог выяснить, почему свойство MethodInfo вызывает исключение.
Кто-нибудь знает, как обеспечить правильную инициализацию этого свойства MethodInfo во время вызова веб-службы?
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Если я не пытаюсь получить доступ к свойству MethodInfo, расширение работает правильно и регистрируется в моей базе данных.
2 ответа
После некоторых проб и ошибок я смог решить эту проблему. Хотя я не совсем понимаю, почему, объект SoapMessage не полностью инициализируется на этапе BeforeDeserialize. Свойства Action и MethodInfo выдают ошибки на этом этапе.
Однако на этапе AfterSerialize кажется, что эти объекты правильно инициализированы. Перемещая строку, которая читает имя сообщения, на более позднюю стадию, объект записи журнала может быть правильно заполнен без исключения.
Похоже, правильный порядок:
BeforeDeserialize
а. Прочитать URL сервера
б. Получить информацию о запросе (сертификаты, адрес хоста пользователя и т. Д.)
с. Чтение содержимого запроса из потока
AfterSerialize
а. Читать исключения
б. Прочтите информацию MethodInfo (и, если необходимо, информацию о Action)
с. Чтение содержимого ответа из потока
Согласно MSDN информация о методе доступна только во время AfterDeserialization и BeforeSerialization. Так что это будет частью проблемы.