经典ASP在集成管道中运行

6

我正在将一个经典的asp应用程序(我知道,很幸运)迁移到混合的asp.net/asp网站上,但似乎我无法访问Request.Form集合。 为了测试,我做了这个:

for each x in Request.Form 
    Response.Write("<br>" & x & " = " & Request.Form(x)) 
next 

我收到了这个错误信息:

请求对象错误 'ASP 0101 : 80004005' 意外错误 [我的脚本],第 xx 行 该函数返回 |。

如果我将应用程序池从集成管道切换到经典模式,则代码可以正常运行,但在 .net 应用程序中运行经典模式不是一个选项。那么,是否有解决方法呢?

2个回答

3
在经典asp中访问Request.Form时出现意外错误的原因是托管代码模块或处理程序触及了请求主体,之后对于本地代码不再可用。
请参考http://www.asp.net/whitepapers/aspnet4/breaking-changes#0.1__Toc256770154
托管HTTP模块读取实体主体的一些部分。例如,模块读取Request.Form或Request.Params。这会导致POST请求的实体主体被读入托管内存。因此,在运行于IIS 7或IIS 7.5集成模式中的任何本机代码模块中,实体主体将不再可用。
如果您控制托管模块,可以使用带有额外HTTP标头的Server.TransferRequest,以便在下次执行模块时进行检查。请参阅此答案:https://dev59.com/NHTYa4cB1Zd3GeqP0_zs#18078054

有没有办法在HttpModule中“触碰请求”,而不会破坏经典的asp。我正在尝试创建一个全能的文件上传拦截器,我已经接近成功了,但是触碰表单会破坏经典的asp上传。 - Ryan Mann
找到了一种方法,但我必须使用httpserv.h ISAPI API中的“CHttpModule”类在C++中制作本地http模块。 - Ryan Mann
对我来说,是Glimpse触及了我的ASP Classic页面。从web.config中删除它后,ASP Classic又可以正常工作了。 - Jared Thirsk

2

在这里,您唯一能做的就是为您的asp经典页面创建另一个应用程序池,并为其创建一个新的应用程序(也称为新的虚拟目录),以便涉及到新的应用程序池。

由于无法在asp和asp.net之间共享任何应用程序或会话范围,因此这不应该成为问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接