我有下一个设置:
接下来有2个控制器操作:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MyAction1()
{
return Redirect("some url");
}
和
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MyAction2()
{
Response.Redirect("some url");
return Redirect("some url");
}
两个动作在本地都可以正常工作。但首先在AWS托管(MyAction1
)上工作并不起作用。它从ELB抛出504错误(网关超时)(超时1分钟)。
我决定比较Response.Redirect("some url");
和return Redirect("some url");
之间的差异。
以下是Redirect("some url")
的反编译代码:
if (context == null)
{
throw new ArgumentNullException("context");
}
if (context.IsChildAction)
{
throw new InvalidOperationException(MvcResources.RedirectAction_CannotRedirectInChildAction);
}
string url = UrlHelper.GenerateContentUrl(this.Url, context.HttpContext);
context.Controller.TempData.Keep();
if (this.Permanent)
{
context.HttpContext.Response.RedirectPermanent(url, false);
return;
}
context.HttpContext.Response.Redirect(url, false);
我将此代码付诸实践并逐行检查。当endResponse
中的context.HttpContext.Response.Redirect(url, false)
参数为false
时,操作开始导致504错误。换句话说:
此代码有效:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MyAction1()
{
Response.Redirect("some url", true);
return Redirect("some url");
}
并且此代码导致504错误
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MyAction2()
{
Response.Redirect("some url", false);
return Redirect("some url");
}
根据endResponse
参数值,调用Response.End()
。如果没有调用,我得到504错误。我想知道是什么导致这种行为。我将调查可能导致Request
长时间运行的此操作后可执行的内容。但是,由于代码在本地工作正常,我怀疑AWS ELB是否可以自行处理302请求而无需转回浏览器并导致问题。我也尝试过:在没有ELB的RDP上在AWS环境中运行此代码,它工作正常。因此,AWS ELB很可能存在问题。
任何建议,可能出错?我应该在哪里看看?