Действие контроллера MVC вызывается дважды - PullRequest
1 голос
/ 11 июля 2011

На сервере IIS 7 с моим приложением ASP.NET MVC 3 я сталкиваюсь со следующей проблемой: когда у меня есть действие, которое занимает достаточно много времени (например, 30 секунд), оно запускается второй раз после cca15-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 ]

2 голосов
/ 24 июля 2011

Из журналов, которые вы опубликовали, похоже, что ваш веб-сервер возвращает HTTP302 , который «временно перемещен» или IIS реализует статус «Объект перемещен».Это звучит как проблема конфигурации сети.

Это происходит с каждым действием или только с этим?

0 голосов
/ 21 июля 2011

Есть ли какая-либо другая разметка, которая может случайно ссылаться на страницу?Ссылки на скрипты, ссылки на изображения, ссылки на CSS - все это может ошибочно вызывать текущую страницу.MVC известен тем, что делает это даже из-за незначительных ошибок, таких как неправильные пути к изображениям.

Не возвращение false из обработчика щелчков JavaScript по ссылке также может вызвать это.Возможно, это не ваша проблема, поскольку я не вижу здесь 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 для проверки каждого запроса, вам может повезти с этим.Или вы можете даже использовать событие Application_BeginRequest в Global.asax для регистрации конкретной информации о каждом запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...