Действия контроллера выполняются несколько раз - приложение ASP.NET MVC 4, запущенное в эмуляторе Azure

Это может занять некоторое время, чтобы объяснить, но здесь я иду :).

Я создал два проекта Visual Studio 2012:

Проект, использующий (Web -> ASP.NET MVC 4 Web Application) в Visual StudioДобавить проект Диалог. Я не'добавить проект модульного тестирования.Проект, использующий шаблон облачной службы Azure (Облако -> Облачная служба Windows Azure). Я добавил одну роль, веб-роль ASP.NET MVC 4, и сновадобавить проект модульного тестирования.

Я оставил оба этих проекта совершенно нетронутыми, так как Visual Studio создал их для меня.

Закаждый проект, я тогда пошел вHomeController класс и установить точку останова в каждом изAbout а такжеContact методы действия (скучные действия, которые просто возвращают представление). Например, я установил точку останова в единственной строке метода:

public ActionResult About()
{
     return View();
}

Затем я начал отладку первого проекта (не-Azure). Все было так, как и ожидалось - то есть, когда я использую браузер для перехода между страницами «О нас» и «Контакт», точка останова в соответствующих методах действий будет попадать по одному запросу при каждом запросе. Казалось, хорошо для меня.

Затем я начал отладку проекта Azure. Я следовал той же процедуре навигации между страницами «О нас» и «Контакты». На этот раз я обнаружил интересное недетерминированное поведение. По некоторым запросам точка останова в методе действия будет попадать несколько раз (иногда более чем в два раза), прежде чем страница будет отображаться. Иногда запрос просто зависает, и страница не будетрендеринг (даже после минут ожидания) .I '

Хотелось бы знать, почему это происходит, потому что это влияет на более сложные вещи в другом приложении Azure MVC, которые мыпродолжает работать (например, из-за этой проблемы приложение может попытаться создать два или более экземпляров объекта модели в моей базе данных для одного запроса) .I '

м в следующей среде:

Windows 8 Pro (x64)Visual Studio 2012 UltimateWindows Azure SDK для Visual Studio 2012IIS 8 ExpressБраузер Firefox с Firebug (также подтвердил поведение с помощью IE)SQL Server 2012 (не очень актуально, я думаю)

Единственное интересное, что я заметил, это то, что вВыход окно в Visual Studio всякий раз, когда я отлаживаю проект Azure:

Переназначение частного порта 80 на 81 в роли 'My_Web_Role_Name» чтобы избежать конфликта во время эмуляции.

Возможно, это переназначение как-то связано с этим. Затем снова, после выполненияnetstat -ano Я видел, что процесс Azure Development Fabric прослушивает порт 80, так что, возможно,потому что это нужно сделать переназначение ... звучит достаточно справедливо.

Тем не менее, я'Я надеюсь, что кто-то может иметь представление о том, что может быть причиной такого поведения. Вот несколько дополнительных моментов и подходов, которые я попробовал:

Сбросьте IIS, перезапустите эмулятор Azure Compute / Storage, перезагрузите всю машинуУдалите представления всех сценариев (то есть поведение остается прежним, если на страницах просто есть основной абзац HTML)Я пытался найти соответствующие файлы журнала IIS Express, но похоже, что проекты Azure неработать через IIS Express, как это делает другой проект (это правильно?).Я наблюдал за консолью Azure Compute Emulator ... ничего особенного там нет.

Итак ... наконец, несколько вопросов:

Кто-нибудь еще может воспроизвести это поведение?Существуют ли какие-либо дополнительные журналы, созданные эмулятором Azure, которые могут мне помочь?

я действительно ценю толчок в правильном направлении здесь :).

Ура!

РЕДАКТИРОВАТЬ

Вот'немного больше информации (яя обновляю этот вопрос, так как я продолжаю отлаживать эту проблему):

Я решил запустить решение без отладки, и я вставил несколько простых сообщений отладки в обаAbout а такжеContact методы действия, например:

public ActionResult About()
{
     System.IO.File.AppendAllText(@"c:\Logs\azure.log", DateTime.Now + ": Contact, thread " + System.Threading.Thread.CurrentThread.ManagedThreadId + "\r\n");
     return View();
}

Я приложилХвост к этому файлу, а также запущенобманщик чтобы увидеть, что происходит через HTTP. Навигация между двумяAbout а такжеContact Снова ссылки, я увидел следующий вывод:

Из хвоста:

...12.09.2012 12:14:07: О, ветка 712.09.2012 12:14:08: контакт, тема 712.09.2012 12:14:09: О, ветка 712.09.2012 12:14:10: контакт, тема 712.09.2012 12:14:11: О, ветка 612.09.2012 12:14:12: контакт, тема 812.09.2012 12:14:31: Контакт, тема 712.09.2012 12:14:50: контакт, тема 712.09.2012 12:15:03: О, ветка 712.09.2012 12:15:05: Контакт, тема 812.09.2012 12:15:23: О, ветка 612.09.2012 12:15:42: О, ветка 1412.09.2012 12:16:01: О, ветка 612.09.2012 12:16:31: контакт, тема 712.09.2012 12:16:33: О, ветка 14...12.09.2012 12:17:08: контакт, нить 1212.09.2012 12:17:09: О, ветка 1212.09.2012 12:17:28: О, ветка 5...

От Fiddler для тех же запросов (обратите внимание, что ямы также играли с настройками конечной точки моей роли, но безрезультатно):

Итак ... сообщения об этом здесь:

HTTP-трафик кажется нормальным (Fiddler не показывает повторяющихся запросов)Методы действия вызываются дважды или трижды, иногда для одного и того же запроса, по-видимому, недетерминированно (т.е. исходная проблема, описанная выше)Интересно, что в моей ситуации кажется, чтоименно так 19 лет проходит раньше другогоудар' происходит в методе действия (то есть, когда методы действия подвергаются многократному обращению, разница во времени между попаданиями является детерминированной)Идентификаторы потоков, как правило, различаются для каждого попадания всякий раз, когда методы действия выполняются несколько раз.

продолжу копать глубже ... может быть, кто-то будет достаточно любезен, чтобы предложить предложение, основанное на этой обновленной информации, хотя :).

РЕДАКТИРОВАТЬ 2 Я решил распечатать идентификатор процесса вместе с идентификатором потока внутри метода действия в каждом случае. Для каждого запроса идентификатор процесса соответствовал рабочему процессу IIS Express. Таким образом, создается впечатление, что рабочий процесс IIS Express иногда порождает несколько потоков для обработки запроса, каждый из которых разделен на 19 с.

... и глубже я иду ... :)

РЕДАКТИРОВАТЬ 3

Я думаю я'Я все ближе к проблеме ... Я посмотрел на лоток IIS Express и увидел следующее после того, как я запустил приложение (без отладки):

Я решил использовать этот URL-адрес напрямую (вместо 127.0.0.2:8888, как показано в Fiddler выше), и проблема, похоже, ушла. Теперь это начинает иметь смысл ... если я вызываю приложение IIS непосредственно через порт 8889, все работает нормально, как и в исходном проекте, отличном от Azure. Если я вызываю веб-роль (то есть специфичную для Azure часть) через порт 8888, иногда кажется, что приложение IIS вызывается несколько раз.

Так что я'Сейчас я начинаю сужать фокус на роли в сети. Я'Попробую посмотреть, смогу ли я найти соответствующие журналы веб-ролей ...

РЕДАКТИРОВАТЬ 4

Я убедилсядиагностика была настроена правильно на приложение и запустил его в режиме отладки. Затем я перешел в пользовательский интерфейс эмулятора вычислений Azure, щелкнул правой кнопкой мыши по своему экземпляру веб-роли и выбрал «Открыть Локальный Магазин ", Это привело меня в Explorer, где я смог найти дочернюю папку "Temp \ Temp \ RoleTemp \ iisexpress» который имел файл журнала с содержимым, которое выглядело так (обратите внимание, что яМы изменили мою конечную точку обратно на порт 80, поэтому приложение IIS Express теперь вернулось на порт 81):

Запрос начался:ПОЛУЧИТЬ" 127.0.0.1:81/Home/AboutЗапрос завершен: 127.0.0.1:81/Home/About с HTTP-статусом 200.0Запрос начался:ПОЛУЧИТЬ" 127.0.0.1:81/Home/ContactЗапрос завершен: 127.0.0.1:81/Home/Contact со статусом HTTP 200.0Запрос начался:ПОЛУЧИТЬ" 127.0.0.1:81/Home/ContactЗапрос завершен: 127.0.0.1:81/Home/Contact со статусом HTTP 200.0Запрос начался:ПОЛУЧИТЬ" 127.0.0.1:81/Home/ContactЗапрос завершен: 127.0.0.1:81/Home/Contact со статусом HTTP 200.0Запрос начался:ПОЛУЧИТЬ" 127.0.0.1:81/Home/AboutЗапрос завершен: 127.0.0.1:81/Home/About с HTTP-статусом 200.0Запрос начался:ПОЛУЧИТЬ" 127.0.0.1:81/Home/AboutЗапрос завершен: 127.0.0.1:81/Home/About с HTTP-статусом 200.0Запрос начался:ПОЛУЧИТЬ" 127.0.0.1:81/Home/AboutЗапрос завершен: 127.0.0.1:81/Home/About с HTTP-статусом 200.0Запрос начался:ПОЛУЧИТЬ" 127.0.0.1:81/Home/ContactЗапрос завершен: 127.0.0.1:81/Home/Contact со статусом HTTP 200.0Запрос начался:ПОЛУЧИТЬ" 127.0.0.1:81/Home/ContactЗапрос завершен: 127.0.0.1:81/Home/Contact со статусом HTTP 200.0Запрос начался:ПОЛУЧИТЬ" 127.0.0.1:81/Home/ContactЗапрос завершен: 127.0.0.1:81/Home/Contact со статусом HTTP 200.0Запрос начался:ПОЛУЧИТЬ" 127.0.0.1:81/Home/AboutЗапрос завершен: 127.0.0.1:81/Home/About с HTTP-статусом 200.0Запрос начался:ПОЛУЧИТЬ" 127.0.0.1:81/Home/ContactЗапрос завершен: 127.0.0.1:81/Home/Contact со статусом HTTP 200.0

Опять же, я просто переключался между страницами «О программе» и «Контакт», поэтому из журнала видно, что один запрос конечной точки веб-роли иногда приводил к тому, что веб-роль вызывала приложение IIS несколько раз. Теперь перейдем к поиску журналов веб-ролей более высокого уровня, чтобы выяснить, почемуделает это :)!

Ответы на вопрос(1)

Ваш ответ на вопрос