HttpModule ATL服务器服务InputStream失败

问题描述:

我想添加一些SOAP消息日志记录功能,以旧的ATL服务器Web服务在Windows Server 2008框中IIS 7.5集成模式下运行,但运行到一个奇怪的问题。为了进一步的背景,我已经将包含HttpModule的程序集添加到ATL Server Web服务的web.config的modules元素中。HttpModule ATL服务器服务InputStream失败

我一直在追踪提供的答案here和记录本身的伟大工程。

但是,无论何时使用此日志记录功能,服务都会响应“SOAP无效请求”,而日志文件具有预期的SOAP消息。我已经做了很多摆弄,并且发现只有当我在BeginRequest事件的处理程序中访问请求对象的InputStream属性时才会发生这种情况。如果我连简单地设置一个变量的InputStream的这样的长度将会失败:

private void OnBegin(object sender, EventArgs e) 
    { 
    var request = _application.Request; 
    //this will blow up 
    var foo = request.InputStream.Position; 
    } 

如果我不碰我的处理程序中的InputStream(不这样做,当我只有多好这样做显然会记录请求的内容),请求会很好地完成。

我可以访问请求对象中的标题值以及涉及的HttpApplication的各种其他属性,但访问InputStream会导致服务窒息。

ATL服务器有内在的东西会阻止我做这种日志记录吗?我是否需要在我的BeginRequest处理程序中添加某种锁定或其他安全措施以确保其行为?我的处理程序是否以某种方式使InputStream陷入了无法使用的状态?

解决这个问题的另一种方法是询问是否有办法看到请求到达我的服务(即在此HttpModule执行后)?

也许值得一提的是我使用SoapUI来测试服务。

编辑: 我现在已经做了一些失败请求跟踪IIS和我得到这个错误信息:

ModuleName IsapiModule 
Notification 128 
HttpStatus 500 
HttpReason Internal Server Error 
HttpSubStatus 0 
ErrorCode 0 
ConfigExceptionInfo 
Notification EXECUTE_REQUEST_HANDLER 
ErrorCode The operation completed successfully. (0x0) 

这来自于处理程序ATL服务器Web服务(即该服务的DLL )。直接在这之前是“GENERAL_READ_ENTITY_START”和“GENERAL_READ_ENTITY_END”的消息,而“END”有这样的消息:

BytesReceived 0 
ErrorCode 2147942438 
ErrorCode Reached the end of the file. (0x80070026) 

这是否意味着什么,我认为这意味着什么?处理程序没有收到任何数据?这是更多的证据指向我的HttpModule搞乱Request的InputStream吗?

所以我最终确定这不是一个可行的方法:我无法让HttpModule在IIS 6中启动(我需要让它为它做一个可接受的解决方案)。我尝试在Request对象上设置Filter属性以及其他各种疯狂的想法,但都没有让我能够在HttpModule中记录请求主体并使服务仍然有效。

所以我做了更多的挖掘,并在codeproject上讨论了关于ATL Server的内部运作的文章,特别是atlsoap.h中的HandleRequest方法。我在那里徘徊了一段时间,想出了一种方法来获取请求主体,并且从那里手动将其写入文件非常简单。

对于那些好奇,这是我加入的handleRequest()的最终代码:

//****************************************REQUEST LOGGING********************************************************** 
     BYTE* bytes = pRequestInfo->pServerContext->GetAvailableData(); 
     FILE* pFile; 
     pFile = fopen("C:\\IISLog\\ATL.txt", "a"); 
     fwrite(bytes, 1, pRequestInfo->pServerContext->GetAvailableBytes(), pFile); 
     fclose(pFile); 
//****************************************REQUEST LOGGING********************************************************** 

我将仍然发挥与它周围多一点,但我有什么似乎是一个可行的解决方案。

你确定你的请求对象是有效的吗?你所做的事情与你参考的样本略有不同。他们从发送者参数中提取流,而你显然依赖于成员变量。

+0

好问题(并感谢回复),但是,我确定该请求是有效的。我已经尝试过使用与相同结果链接的示例的确切语法。我也做了一个健全的检查,并将这个HttpModule添加到一个普通的简洁的ASP.NET网站,它工作正常(请求被记录并显示在目标页面中)。很奇怪。 –