.NET SOAP Extension 在 MethodInfo 中抛出 NullReferenceException?

.NET SOAP Extension is throwing NullReferenceException inside MethodInfo?

提问人:Jay S 提问时间:10/23/2008 最后编辑:Jay S 更新时间:10/23/2008 访问量:2801

问:

注意:使用 .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;

LogInput 方法在尝试访问它尝试记录的消息对象的 MethodInfo 属性时失败。下面是调用该属性的代码块:

entry = new MyServerLogEntry();
entry.ServerURL = message.Url;
entry.Method = (message.MethodInfo == null) ? null : message.MethodInfo.Name;

当消息。MethodInfo 被调用,它冒泡到 SoapServerProtocol.get_MethodInfo(),并且 null 引用异常被抛入其中。我已经在谷歌上搜索并检查了 Stack Overflow,但无法找出为什么 MethodInfo 属性会抛出异常。

有谁知道如何确保在 Web 服务调用期间正确初始化此 MethodInfo 属性?

其他详细信息:如果我不尝试访问 MethodInfo 属性,则扩展将正常工作并记录到我的数据库中。

.NET Web 服务 异常 SOAP-Extension

评论


答:

2赞 Jay S 10/23/2008 #1

经过反复试验,我已经能够解决这个问题。虽然我不完全理解为什么,但 SoapMessage 对象在 BeforeDeserialize 阶段没有完全初始化。Action 和 MethodInfo 属性在此阶段都会引发错误。

但是,在 AfterSerialize 阶段,这些对象似乎已正确初始化。通过将读取消息名称的行移动到稍后阶段,可以正确填充日志条目对象而不会引发异常。

看来正确的顺序是:

  1. 之前Deserialize

    a.a. 读取服务器 URL

    b.检索请求信息(证书、用户主机地址等)

    c. 从流中读取请求内容

  2. AfterSerialize

    a. 读取异常

    b. 读取 MethodInfo 信息(必要时读取操作信息)

    c.c. 从流中读取响应内容

1赞 Thedric Walker 10/23/2008 #2

根据 MSDN 的说法,该方法信息仅在 AfterDeserialization 和 BeforeSerialization 期间可用。所以这将是问题的一部分。