症状:
有些用户无法成功发帖,大多数都可以成功发帖
发生错误时,用户将被重定向到站点的“共享/错误”页面。
使用的技术:
IIS v6
Windows Server 2003
asp.net v3.5
asp.net mvc framework v1.0
jQuery的
LINQ
sql server 2005
身份验证:带有AspNetActiveDirectoryMembershipProvider的Windows 这是web.config的片段:
<authentication mode="Windows"/>
<membership defaultProvider="AspNetActiveDirectoryMembershipProvider">
<providers>
<add name="AspNetActiveDirectoryMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider,
 System.Web, Version=2.0.3600.0, Culture=neutral,
 PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ADConnString" connectionUsername="" connectionPassword=""/>
</providers>
</membership>
以下是启动豁免的视图中的链接
<a href="javascript:void(document.frmCurrentLineItems.submit())" title="Saves this month only">Save This Month</a>
这里有一些基于jQuery的javascript:
$("form#frmCurrentLineItems").submit(function() {
submitView(this);
return false;
});
function submitView(form) {
$.ajax(
{
type: form.method,
url: form.action,
data: $(form).serialize(),
dataType: "html",
error: function(error) {
alert(error);
}
}
);
}
这是控制器方法的一部分:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CurrentLineItems(FormCollection thisForm)
// Get the forecast from the session
BusinessLogic.ForecastBL thisForecast = (BusinessLogic.ForecastBL)HttpContext.Session["ForecastMetaData"];
if (thisForecast != null)
{
// Run the save to db stuff here
return View("CurrentLineItems", ViewData["LineItemSummary"]);
}
else
{
return Redirect("../Shared/Error");
}
注意上面的代码...我很确定将预测对象拉出会话不会导致错误,至少我假设它不是因为会话已经过期,因为用户认为无法保存,打开页面时无法保存,然后立即尝试保存。
该类还具有以下属性:
[HandleError]
[Authorize]
public class ForecastController : Controller
{
该站点在IIS属性中具有身份验证方法:
启用匿名访问并选中“集成Windows身份验证”。
以下是遇到此问题的用户的IIS日志:
466 2009-04-28 16:41:15 W3SVC1100645706 192.168.10.22 POST / Forecast / CurrentLineItems - 443 - XX.XX.XX.XX Mozilla / 4.0 +(兼容; + MSIE + 7.0; + Windows + NT + 5.1; + GTB5; +。NET + CLR + 1.1.4322)401 1 0
467 2009-04-28 16:41:15 W3SVC1100645706 192.168.10.22 POST / Forecast / CurrentLineItems - 443 DOMAIN \ username XX.XX.XX.XX Mozilla / 4.0 +(兼容; + MSIE + 7.0; + Windows + NT + 5.1 ; + GTB5; +。NET + CLR + 1.1.4322)302 0 0
468 2009-04-28 16:41:15 W3SVC1100645706 192.168.10.22 GET /共享/错误 - 443 - XX.XX.XX.XX Mozilla / 4.0 +(兼容; + MSIE + 7.0; + Windows + NT + 5.1; + GTB5; +。NET + CLR + 1.1.4322)401 1 0
469 2009-04-28 16:41:16 W3SVC1100645706 192.168.10.22 GET / Shared / Error - 443 DOMAIN \ username XX.XX.XX.XX Mozilla / 4.0 +(兼容; + MSIE + 7.0; + Windows + NT + 5.1 ; + GTB5; +。NET + CLR + 1.1.4322)404 0 0
以下是为了更好的可读性而剥离了相同的线条:
2009-04-28 16:41:15 POST / Forecast / CurrentLineItems - 443 - XX.XX.XX.XX 401 1 0
2009-04-28 16:41:15 POST / Forecast / CurrentLineItems - 443 DOMAIN \ username XX.XX.XX.XX 302 2009-04-28 16:41:15 GET / Shared / Error - 443 - XX.XX. XX.XX 401 1 0
2009-04-28 16:41:16 GET / Shared / Error - 443 DOMAIN \ username XX.XX.XX.XX 404 0 0
注意到所有POST请求看起来都像上面那样...除了成功的一个在第二个POST上返回200 ...
那么我如何确定导致上面第一个POST的原因...是没有DOMAIN \用户名信息进入Web服务器并获得401错误的那个?
为什么302错误?
好像我要求两个帖子......但是我不太清楚为什么浏览器会发送两个POST请求? (当然......我怀疑我的代码,但不能弄明白为什么。)
任何有助于追踪上述错误的故障排除方法都将受到赞赏。
我现在看看Troubleshooting HTTP 401 errors in IIS编辑......这对我的问题没什么帮助
答案 0 :(得分:2)
您回来的第一个401是NTLM身份验证方案的一部分,它是IIS处理Windows身份验证的方式。发出请求,它返回401,因此它再次尝试传递NTLM身份验证信息。
所以你的第一篇文章进来了,得到一个401,然后用身份验证重试并获得302.这是你重定向到你的错误页面。然后您的错误页面获得401,再次尝试并获得404.
所以你有两个问题,第一个是控制器中的某种错误。它可能是空检查重定向,也可能是另一个错误,您是否记录了错误?此外,我会抛出异常而不是重定向..然后你的handleError逻辑应该启动并为你处理它。
第二种情况是,您的错误页面看起来不存在或您的路由混乱了。
答案 1 :(得分:0)
更改指向输入按钮/元素的链接似乎解决了这个问题...
<input type="submit" value="Save This Month" title="Saves this month only" class="submitBtn"/>
由于输入按钮位于我想提交的表单内...它会点击Post控制器操作并保存数据然后显示视图......