OK,这听起来有点混乱和复杂,所以忍耐一下。
我们已经写了一个框架,允许我们定义友好的URL。 如果您冲浪任意URL,IIS尝试显示404错误(或者,在某些情况下,403; 14或405)。 但是,IIS被设置成指向那些特定的错误,任何被发送到.aspx文件。 这使我们能够实现一个HttpHandler处理请求和做的东西,其中包括寻找相关的模板,然后执行任何与它有关。
现在,这个在IIS 5和6,所有的作品在一定程度上IIS7 - 但对于一个陷阱,当你发布形式发生。
看,当你发布形式不存在的URL,IIS说:“啊,但该网址不存在”,并抛出一个405法“不允许”的错误。 因为我们告诉IIS这些错误重定向到我们.aspx页面中,因此我们的HttpHandler处理它,这通常是没有问题的。 但作为IIS7的,所有的POST信息已经被重定向到405后失踪,所以你可以不再做最琐碎的涉及形式的东西。
为了解决这个问题,我们已经使用的HttpModule,它保留POST数据,但出现在正确的时间,以不具有初始化会话(在需要时)尝试。 我们也尝试使用的HttpModule的所有请求,而不仅仅是打四百零三分之四百零四丢失的请求;四百○五分之一十四,但是这意味着东西,如图像,CSS,JS等正在由.NET代码,这是非常低效的处理。
这使我实际的问题:有没有人遇到过这一点,并没有任何人有任何意见或不知道怎样做才能得到的东西再工作? 到目前为止,已经有人使用微软自己的建议URL重写模块 。 这会帮助解决我们的问题呢?
谢谢。
微软发布了一个修补程序如下:
http://support.microsoft.com/default.aspx/kb/956578
因为IIS7使用.NET从上往下就不会有使用一个HttpModule的任何性能开销,其实有一些总是在每次请求使用的几种管理的HttpModules。 当BeginRequest事件被触发,则SessionStateModule可能没有被添加到模块集合,因此,如果您尝试此事件中处理该请求没有会话状态信息将可用。 如果请求的处理程序需要它,所以你可以设置处理您看中的404页,实现IRequiresSessionState设置HttpContext.Handler属性将初始化会话状态。 下面的代码应该做的伎俩,虽然你可能需要编写不同的实现为ISMISSING()方法:
using System.Web;
using System.Web.UI;
class Smart404Module : IHttpModule
{
public void Dispose() {}
public void Init(HttpApplication context)
{
context.BeginRequest += new System.EventHandler(DoMapping);
}
void DoMapping(object sender, System.EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
if (IsMissing(app.Context))
app.Context.Handler = PageParser.GetCompiledPageInstance(
"~/404.aspx", app.Request.MapPath("~/404.aspx"), app.Context);
}
bool IsMissing(HttpContext context)
{
string path = context.Request.MapPath(context.Request.Url.AbsolutePath);
if (System.IO.File.Exists(path) || (System.IO.Directory.Exists(path)
&& System.IO.File.Exists(System.IO.Path.Combine(path, "default.aspx"))))
return true;
return false;
}
}
编辑:我添加ISMISSING的实现()
注意:在IIS7,会话状态模块不全局默认情况下运行。 有两个选项:允许所有的请求的会话状态模块(见上面关于所有请求类型运行管理模块,我的意见),或者你可以使用反射来访问内部System.Web.dll的内部成员。
POST变量没有被通过自定义错误处理程序传递的是固定在Service Pack 2的Vista在IIS 7的问题。 还没有尝试过的Windows服务器上,但我敢肯定,这将是固定有太多。
只是一个猜测:在IIS7的%WINDIR指定的处理程序%\ SYSTEM32 \ INETSRV \设置\对ApplicationHost.config正在处理您的请求不允许POST动词通过在所有获得,它是确定是否在URL之前评估该规则不存在。
是的,我肯定会推荐URL重写(使用微软的IIS7一个或多个选择中的一个)。 这是专为提供友好的URL设计,而错误的文件是失败最后一搏逆止器,这往往Munge时间传入的数据,因此它可能不是你所期望的。
文章来源: Posting forms to a 404 + HttpHandler in IIS7: why has all POST data gone missing?