Расширение .NET SOAP создает исключение NullReferenceException внутри MethodInfo? - PullRequest
2 голосов
/ 22 октября 2008

ПРИМЕЧАНИЕ: Использование .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 ]

2 голосов
/ 22 октября 2008

После некоторых проб и ошибок я смог решить эту проблему. Хотя я не совсем понимаю, почему, объект SoapMessage не полностью инициализируется на этапе BeforeDeserialize. На этом этапе свойства Action и MethodInfo выдают ошибки.

Однако на этапе AfterSerialize эти объекты, похоже, правильно инициализированы. Переместив строку, которая читает имя сообщения, на более позднюю стадию, объект записи в журнале может быть правильно заполнен без исключения.

Похоже, правильный порядок:

  1. BeforeDeserialize

    а. Прочитать URL сервера

    б. Получить информацию запроса (сертификаты, адрес хоста пользователя и т. Д.)

    с. Чтение содержимого запроса из потока

  2. AfterSerialize

    а. Читать исключения

    б. Прочтите информацию MethodInfo (и, если необходимо, информацию Action)

    с. Чтение содержимого ответа из потока

1 голос
/ 22 октября 2008

Согласно MSDN информация о методе доступна только во время AfterDeserialization и BeforeSerialization. Так что это будет частью проблемы.

...