注: .NET 2.0 および VS2005 を IDE として使用する
皆さんこんにちは、
私はデータベースへの Web サービス呼び出しのログ記録に取り組んでおり、最終的に、別のプロジェクトから移植された非常に簡素化された実装を使用して SoapExtension を構成し、実行することができました。すべてのメソッドで実行されるように、構成ファイルで設定しました。Web サービスを呼び出して SOAP 拡張機能が起動すると、SoapServerMessage がその MethodInfo プロパティを呼び出そうとすると、NullPointerException がスローされます。
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 メソッドは、ProcessMessage(SoapMessage) の BeforeDeserialize ステージで呼び出されます。
SoapMessageStage.BeforeDeserialize:
CopyStream(_oldStream, _newStream);
_newStream.Position = 0;
if(_enabled)
LogInput(message);
break;
また、ログに記録しようとしているメッセージ オブジェクトの MethodInfo プロパティにアクセスしようとすると、LogInput メソッドが失敗します。プロパティが呼び出されるコードのブロックは次のとおりです。
entry = new MyServerLogEntry();
entry.ServerURL = message.Url;
entry.Method = (message.MethodInfo == null) ? null : message.MethodInfo.Name;
message.MethodInfo が呼び出されると、SoapServerProtocol.get_MethodInfo() にバブル オーバーし、そこで null 参照例外がスローされます。私はググって、Stack Overflow でこのあたりをチェックしましたが、MethodInfo プロパティが例外をスローする理由を見つけることができませんでした。
Web サービスの呼び出し中にこの MethodInfo プロパティが適切に初期化されるようにする方法を知っている人はいますか?
追加の詳細: MethodInfo プロパティにアクセスしようとしない場合、拡張機能は正しく機能し、データベースにログが記録されます。