MVC控制器动作被调用两次

时间:2011-07-11 18:14:36

标签: asp.net asp.net-mvc-3 iis-7

在使用我的ASP.NET MVC 3应用程序的IIS 7服务器上,我遇到了以下问题:当我有一个操作需要相当长的时间才能完成(例如30秒)时,它会在cca之后第二次被触发从第一次请求开始15-20秒。我可以在Fiddler(HTTP嗅探器)中看到浏览器不是罪魁祸首 - 它只发送一次请求。但是,在IIS日志文件中,我可以看到两次请求。但是,在IIS日志中,两个请求都具有相同的时间戳(不在我自己的日志文件中 - 这两个请求之间的间隔为15-20秒)。

最初,该操作正在处理上传的文件,将其存储在数据库等中。但是,即使我将操作更改为只调用Thread.Sleep(30000),它仍然会被调用两次。

这不是由一些故障的JavaScript或缺失图像引用引起的,这似乎是这种行为的常见原因,因为我在StackOverflow上阅读了类似的问题。我不能在开发ASP.NET服务器上复制它,只能在IIS服务器上复制,而只能在我使用的两个服务器中复制一个。

这是用于触发该操作的HTML表单

@model TMAppServer.Abstract.DataTransferObject.ProjectOverviewData

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <title>UploadTestForm</title>
</head>
<body>
    <div>
        @using (Html.BeginForm("UploadFileNew", "Manager", new { targetLanguage = "CS" }, FormMethod.Post, new { enctype = "multipart/form-data" }))
        {
            <input id="files" type="file" name="files" /><text><input type="submit" id="uploadFile" value="Upload the document..." /><input type="hidden" name="projectId" id="projectId" value="@(Model.Job.Name)" />
        }
    </div>
</body>
</html>

这是控制器动作:

public ActionResult UploadFileNew(string projectId, string targetLanguage, IList<HttpPostedFileBase> files)
{    
    foreach (var file in files)
    {
        if (null == file)
            continue;

        Thread.Sleep(30000);
    }
    return RedirectToAction("GetProjectOverview", new { projectId = projectId });
}

感谢您提出任何建议。

编辑:现在我发现这只发生在我从同一网络(如server.domain.com)通过域名访问服务器时,通过其IP地址访问服务器时不会发生这种情况或来自外部网络。

这是我在IIS日志中获得的内容:

2011-07-21 01:23:31 W3SVC2 WIN-AD50B4LJ2SU 192.168.1.48 POST /manager/upload-file projectId=3366 80 - 192.168.1.1 HTTP/1.1 Mozilla/5.0+(Windows+NT+6.1;+WOW64;+rv:5.0.1)+Gecko/20100101+Firefox/5.0.1 .ASPXAUTH=cookie http://tm.web.com/manager/projects/3366/overview tm.web.com 302 0 0 440 6232309 578
2011-07-21 01:23:31 W3SVC2 WIN-AD50B4LJ2SU 192.168.1.48 GET /manager/projects/3366/overview - 80 - 192.168.1.1 HTTP/1.1 Mozilla/5.0+(Windows+NT+6.1;+WOW64;+rv:5.0.1)+Gecko/20100101+Firefox/5.0.1 .ASPXAUTH=cookie http://tm.web.com/manager/projects/3366/overview tm.web.com 200 0 0 30125 769 93
2011-07-21 01:23:31 W3SVC2 WIN-AD50B4LJ2SU 192.168.1.48 POST /manager/upload-file projectId=3366 80 - 192.168.1.1 HTTP/1.1 Mozilla/5.0+(Windows+NT+6.1;+WOW64;+rv:5.0.1)+Gecko/20100101+Firefox/5.0.1 .ASPXAUTH=cookie http://tm.web.com/manager/projects/3366/overview tm.web.com 302 0 64 0 6232309 39406

这些是我在Global.asax.cs

中的路线
public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");            

    routes.MapRoute(null,
                    "manager/upload-file",
                    new { controller = "Manager", action = "UploadFile" },
                    new { httpMethod = new HttpMethodConstraint("POST") }
    );      

    routes.MapRoute(null,
                    "manager/projects/{projectId}/overview",
                    new { controller = "Manager", action = "GetProjectOverview" },
                    new { httpMethod = new HttpMethodConstraint("GET") }
    );      

    routes.MapRoute(null,
                    "manager/{action}",
                    new { controller = "Manager", action = "Main" },
                    new { httpMethod = new HttpMethodConstraint("GET") }
    );            

    routes.MapRoute("Default", // Route name
                    "{controller}/{action}/{id}", // URL with parameters
                    new { controller = "Manager", action = "ListProjects", id = UrlParameter.Optional } // Parameter defaults
    );
}

2 个答案:

答案 0 :(得分:2)

从您发布的日志中看起来您的Web服务器正在返回HTTP302,即“暂时移动”或IIS实现“Object Moved”状态。这听起来像是网络配置问题。

是否会发生每一个动作或只发生一个动作?

答案 1 :(得分:0)

是否有其他标记可能会意外引用该页面?脚本引用,图像引用,CSS引用都可能错误地回忆当前页面。 MVC以实现这一点而闻名,即使是错误的图像路径也会出现这种错误。

不从链接上的javascript点击处理程序返回false也可能导致此错误。可能不是你的问题,因为我在你的代码中看不到js,但想到我会提到它,以防你在你的母版页中有一些隐藏吗?它可以触发链接的默认操作,例如:

<%= Html.ActionLink( "action", "controller" ) %>

$(function() {
   $('a').click( function() {
      var href = $(this).attr('href');
      $.get( href, function() { ... } );
      // needs "return false;" here to prevent double request
   });
}):

在调试模式下是否可以重新创建此错误?这将是逐步完成每个请求的主要方法。如果没有,我会让Fiddler检查每个请求,你可能会很幸运。或者您甚至可以使用Global.asax的Application_BeginRequest事件来记录有关每个请求的特定信息。