我在.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&gt;网站&gt;属性&gt;主目录选项卡&gt;配置按钮&gt;添加”中设置.resource扩展名以使用GET,HEAD和POST。这可以防止我在提交时遇到405错误。
编辑:我将POST更改为GET,并且在所有3种情况下它都正确地提交了数据,因此它不是表单问题。不幸的是,我无法在查询字符串中传递变量(有109个)。
答案 0 :(得分:2)
我遇到了同样的问题,不幸的是,看起来答案是“这是一个功能。”
在这里阅读更多内容: 好的,我尝试发布问题说明的链接,但它说“新用户无法发布链接”。所以相反,我能做的最好的就是:谷歌搜索“IIS 6:在404/405自定义错误处理程序中缺少表单发布数据”(确保它在引号中),至少在我写这篇文章的时候,最重要的结果应该是我所指的页面。
总之,发生的事情是:
1)您不存在的网址已POST(例如,mydomain.com / somepage) 2)IIS接收请求,注意某个页面不存在,然后它向您的错误处理程序发出第二个请求,该请求的方法在内部是GET。并且没有传递任何POST数据。
这就留下了为什么你每个在IIS 6上取得成功的原因 - 让我感到困惑。
无论如何,请阅读以上链接了解更多信息。
顺便说一句,我在IIS 6 / Windows2003上运行PHP,我发现了一个有趣的解决方法。虽然PHP没有从IIS接收POST变量(如您所料),但PHP仍然可以访问由“php:// input”标识的原始输入流,它可以读取原始请求机构来自。这将包含原始格式的POST变量 - 我能够使用PHP的parse_str()函数从原始字符串中获取POST变量。
因此,可能可以在ASP.NET中执行类似的操作。您是否尝试过检查Request.InputStream?如果我的记忆正确地为我服务,那将为您提供一个可以阅读的流。也许它会有原始的POST数据?
-Josh
答案 1 :(得分:1)
尝试暂时将表单方法更改为 GET 。这应该告诉您是否正在发送任何数据以及正在发送什么数据。
之前我遇到过类似的问题,最终导致生成发送内容的脚本出现问题,而不是数据发送时。