这真让我抓狂。我有一个混合了 ASP.NET MVC 3 和 Classic ASP 的 Web 应用程序。经典的 ASP 代码非常陈旧,在防止跨站点脚本或任何其他漏洞方面并没有起到多大作用。为了给 Classic ASP 页面增加一点安全性,我创建了一个 IIS 模块,该模块将在 HTTP 请求被 Classic ASP 处理之前拦截它并触发请求的 ASP.NET 验证。这里是:
public class RequestValidationModule : IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
}
void context_PreRequestHandlerExecute(object sender, EventArgs e)
{
var context = HttpContext.Current;
if (context != null)
{
var request = context.Request;
if (request != null)
{
string path = request.CurrentExecutionFilePathExtension;
if(string.Equals(path, ".asp", StringComparison.OrdinalIgnoreCase))
{
//access request collections to trigger request validation
var form = request.Form;
var qs = request.QueryString;
var c = request.Cookies;
var h = request.Headers;
}
}
}
}
}
这个模块工作得很漂亮。但是,如果发送了一个有效的请求,那么经典 ASP 代码中的对象Request.Form始终为空!我无法获取表单(或查询字符串)中提交的任何值。一旦我从 web.config 中删除模块,request.form 就会再次填充。
这是一个在 IIS 7.5 集成模式下运行的 ASP.NET MVC 3 应用程序。所有的 asp 页面都在 MVC 3 应用程序内的一个目录中。