我正在尝试构建一个代理,该代理可以为内部站点(隐藏来源)的请求提供服务,但同时检查数据包并异步对其进行后处理。
例如。假设所有 SOAP 调用http://www.foo.com http://www.foo.com将会去http://192.168.1.1 http://192.168.1.1,同时存储在数据库中以供后期分析。内部服务器是一个黑匣子,因此更改其上的某些内容超出了本问题的范围。
无论如何,我已经配置了 ARR,使用反向代理,使用通配符进行 URL 重写过滤器,所有工作都完美无缺。然后,我尝试添加一个用 C# 编写的托管 HttpModule,并连接到 Application_BeginRequest 和 Application_EndRequest。我能够访问请求标头、最终请求的响应标头(应用程序池处于集成模式),甚至能够通过在 Response.Filter 上设置过滤器来从输出流读取响应内容,该过滤器将所有写入缓存在附加内存流中。
问题是,当我尝试从请求读取(在模块 BeginRequest 处理程序内)输入流时,ARR 会停留一段时间并抛出一个
HTTP 错误 502.3 - 网关错误
操作超时处理程序
应用程序请求路由处理程序
错误代码 0x80072ee2
所以就超时了。
查看失败的请求跟踪我看到:
MODULE_SET_RESPONSE_ERROR_STATUS
警告
ModuleName =“应用程序请求路由”,
通知=“EXECUTE_REQUEST_HANDLER”,
HttpStatus =“502”,HttpReason =“坏”
网关", HttpSubStatus="3",
错误代码=“2147954402”,
配置异常信息=“”
SET_RESPONSE_ERROR_DESCRIPTION 警告
ErrorDescription="操作已计时
出去”
现在网上任何类似的帖子都没有帮助,因为这不是超时错误(代理有 120 秒设置,页面响应时间在 100 毫秒以下),当我评论尝试读取 FORM 数据的处理程序代码时或输入流数据,一切都充满魅力。
即使我在读取输入流后将其位置设置为 0,我仍然会超时。
如果我读取 EndRequest 上的输入流,它会获取 0 字节,即使它是 POST 请求。 (这显然是错误的)
ARR 是否存在错误,因为我在尝试重新路由之前尝试读取输入流?
使用的东西:Windows Server 2008 R2
IIS 7.5 ARR v2 .Net 框架 3.5
模块
有想法吗?
谢谢
/科斯明
如果您可以切换到.Net Framework 4,则有一个解决方案。
在 HttpModule 事件处理程序中完成 BeginRequest/EndRequest 后,添加对HttpRequest.InsertEntityBody.
/* BeginRequest event: Executes before request is processed */
private void Application_BeginRequest(Object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpRequest request = application.Context.Request;
// Do something with request
DoMyOwnRequestProcessing(request);
// After you finish, make sure IIS gets the entity body
// For example, Application Request Routing needs this
request.InsertEntityBody();
}
看看MSDN上的这个:HttpRequest.InsertEntityBody http://msdn.microsoft.com/en-us/library/ee169616.aspx.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)