我正在尝试为我的ASP.NET Web服务的所有SOAP方法调用创建一个日志记录服务.我一直在查看 来自控制台应用程序的Log SOAP消息以及MSDN上SOAP扩展的演练(http://msdn.microsoft.com/en-us/library/s25h0swd%28v=vs.100%29.aspx)但他们似乎并没有完全覆盖它.
我不想改变SOAP消息,只需将其记录到数据库表中即可.我正在尝试做的是读取SOAP消息流,将其解析为XML,记录XML并让调用以其快乐的方式进行.但是当我读取它时,它被花费/处理掉了.我已经尝试复制流内容以不中断流.
根据演练,该ProcessMessage方法应如下所示:
public override void ProcessMessage(SoapMessage message)
{
switch (message.Stage)
{
case SoapMessageStage.BeforeSerialize:
break;
case SoapMessageStage.AfterSerialize:
// Write the SOAP message out to a file.
WriteOutput( message );
break;
case SoapMessageStage.BeforeDeserialize:
// Write the SOAP message out to a file.
WriteInput( message );
break;
case SoapMessageStage.AfterDeserialize:
break;
default:
throw new Exception("invalid stage");
}
}
Run Code Online (Sandbox Code Playgroud)
我已经设法在BeforeDeserialize阶段期间解析流没有问题,但然后ProcessMessage在AfterSerialize阶段再次调用,然后使用流并且不再包含任何数据.
根据SOAP消息修改使用SOAP扩展(http://msdn.microsoft.com/en-us/library/esw638yk%28v=vs.100%29.aspx),SOAP调用将执行以下步骤:
服务器端接收请求消息并准备响应
- Web服务器上的ASP.NET接收SOAP消息.
- 在Web服务器上创建SOAP扩展的新实例.
- 在Web服务器上,如果这是第一次在服务器端使用此Web服务执行此SOAP扩展,则会在服务器上运行的SOAP扩展上调用GetInitializer方法.
- 调用Initialize方法.
- 调用ChainStream方法.
- 使用设置为 …