1

我在 .NET 3.5 中构建了一个自定义 404 CMS 系统,虽然发布数据在 IIS 5.1 和 6.0 中本地工作,但它在生产 IIS 6.0 服务器上不起作用。我逐项比较了 IIS 6.0 站点设置,它们几乎相同,唯一的区别无关紧要。

我验证了表单在每种情况下都发布到“ http://domain/folder/folder/page.resource ”(代码在SVN中)并且提交时没有发生重定向(我抛出异常以确保) . 服务器的一些调试信息:

IIS 5.1 (my computer, works):
ServerVariables["REQUEST_METHOD"]="POST"
Request.TotalBytes = 1600
Request.QueryString.Count = 1 (NOTE: contains "404;http://domain:80/folder/folder/page.resource" in each case)
Request.Form.Count = 109

IIS 6.0 (test server, works):
ServerVariables["REQUEST_METHOD"]="GET" (NOTE: IIS 6.0 reads this as "GET" instead of "POST")
Request.TotalBytes = 1600
Request.QueryString.Count = 1
Request.Form.Count = 109

IIS 6.0 (production server, does not work):
ServerVariables["REQUEST_METHOD"]="GET"
Request.TotalBytes = 0 (NOTE: should be ~1600)
Request.QueryString.Count = 1
Request.Form.Count = 0 (NOTE: should be 109)

有没有人有任何想法?我已经阅读过 POST 数据未在 IIS 7.0 中提交的 404 页,但在 6.0 中没有。我的表格是这种格式:

<form id="GolfRegistration" name="GolfRegistration" method="POST" action="/folder/folder/page.resource" onSubmit="return CalculateAmount();">
<input type="button" value="Submit" onClick="if(ValidateInput()){submit(GolfRegistration);}">
</form>

仅对于 IIS 5.1,我在“IIS > 网站 > 属性 > 主目录选项卡 > 配置按钮 > 添加”中设置了 .resource 扩展名以使用 GET、HEAD 和 POST。这可以防止我在提交时收到 405 错误。

编辑:我将 POST 更改为 GET,并且在所有 3 种情况下它都正确提交了数据,所以这不是表单问题。不幸的是,我无法在查询字符串中传递变量(有 109 个)。

4

2 回答 2

2

我遇到了同样的问题,不幸的是,答案似乎是“这是一个功能”。

在此处阅读更多信息: 好的,我尝试发布指向问题描述的链接,但它显示“新用户无法发布链接”。因此,我能做的最好的事情是:在 Google 上搜索“IIS 6:404/405 自定义错误处理程序中缺少表单发布数据”(确保它在引号中),至少在我写这篇文章的时候,最上面的结果应该是我所指的页面。

总之,正在发生的事情是:

1) 你不存在的 URL 被 POST'd 到(例如,mydomain.com/somepage) 2) IIS 接收到请求,注意到 somepage 不存在,然后它向你的错误处理程序发起第二个请求,并且该请求的方法在内部是 GET。并且您的任何 POST 数据都不会传递。

这就留下了一个问题,即为什么你们都IIS 6 上取得了成功——这让我感到困惑。

无论如何,请阅读上面的链接了解更多信息。

顺便说一句,我在 IIS 6/Windows2003 上运行 PHP,我发现了一个有趣的解决方法。虽然 PHP 没有从 IIS 接收 POST 变量(如您所料),但 PHP 仍然可以访问由“php://input”标识的原始输入流,它可以从中读取原始请求正文。这将包含原始格式的 POST 变量——我能够使用 PHP 的 parse_str() 函数从原始字符串中获取 POST 变量。

因此,在 ASP.NET 中可以做类似的事情。你试过检查 Request.InputStream 吗?如果我的记忆正确,那将为您提供一个可以读取的流。也许它会有原始的 POST 数据?

-乔什

于 2009-05-22T18:27:27.380 回答
1

尝试暂时将表单方法更改为GET。这应该告诉您是否正在发送任何数据以及正在发送什么数据。

我之前遇到过类似的问题,最终是脚本生成正在发送的内容的问题,而不是数据发送时的问题。

于 2009-05-05T13:34:19.530 回答