Развертывание ASP.NET MVC 2 в IIS 7.5 с таргетингом на .NET 3.5

Я создал приложение ASP.NET MVC 2 в Visual Studio 2008. Я настроил сборку выпуска на прохождение компилятора ASP.NET для предварительной компиляции всех представлений, минимизации Javascript и CSS, очистки файла web.config и т. Д. развертывание происходит на сервере IIS6, я настроил свое псевдопроизводственное развертывание на моем компьютере с Windows 7, чтобы пул приложений работал в классическом режиме, ориентированном на среду выполнения 2.0. Я установил обработчик без расширений в файле web.config, который необходим, и все отлично заработало.

Проблема возникла, когда я обновил решение до Visual Studio 2010. Я все еще нацелен на платформу 3.5, но теперь я использую MSBuild 4.0, поскольку это то, что использует Visual Studio 2010. Все по-прежнему компилируется правильно, потому что отлично работает под Cassini, но когда я развертываю его в том же месте (тот же пул приложений, идентификатор и т. Д.), Он теперь ведет себя по-другому. У меня все еще есть обработчик без расширений в web.config, но теперь, когда я перехожу в корень приложения, он просматривает каталог, и любые маршруты, которые он ранее обрабатывал, теперь возвращаются как 404 ошибки, обрабатываемые обработчиком StaticFile в IIS . Я не понимаю, что изменилось и стало причиной перерыва.

Я просмотрел этот вопрос, но я уже убедился, что все необходимые компоненты установлены.


person Agent_9191    schedule 24.05.2010    source источник


Ответы (4)


Вы пытались отладить свои маршруты с помощью отладчика маршрутов Фила Хаака на сервере?

Изменить:
В IIS 7.5 вам не нужен специальный обработчик без расширений, это обрабатывается автоматически, вам не нужно ничего менять. Насколько я знаю, это необходимо только на IIS 6. Может ли это быть проблема? что, если вы удалите этот специальный обработчик? возможно, это то, что мешает ему запустить двигатель маршрута.

Изменить:
Я дважды проверил, и, как я думал, начиная с IIS7, режимом по умолчанию для домена приложения является Интегрированный режим. Это означает, что стек Asp.net срабатывает при каждом запросе, тогда как в классическом режиме asp.net вызывался только тогда, когда вызывались определенные расширения (aspx ashx axd по умолчанию сопоставлены с фильтром aspnet_isapi).
UrlRoutingModule срабатывает при каждом запросе, ничего не требуя от вас, потому что это HttpModule, а не Handler. (его просто нужно зарегистрировать в файле конфигурации вашего приложения, нет необходимости сопоставлять его с расширением, но это по умолчанию в приложении MVC. Вы можете открыть файл Web.Config и убедиться, что у вас есть в узел

<modules runAllManagedModulesForAllRequests ="true">
...
<add name="UrlRoutingModule" type=.../>
</modules>

Вы уверены, что развертываете сборки MVC на сервере? Убедитесь, что для ссылок System.Web.Mvc, System.Web.Routing и System.Web.Abstraction для свойства Copy Local установлено значение true, убедитесь, что вы используете одни и те же сборки локально и на своем производственном сервере ...

Если все верно, я не знаю, как помочь вам больше ... Надеюсь, это поможет вам или, по крайней мере, направит вас на верный путь.

РЕДАКТИРОВАТЬ: Ой ... просто прочтите свой последний комментарий ... извините, я пропустил этот элемент о классическом режиме. В вашем заголовке упоминается IIS7.5, и я слишком много предполагал. вот почему я запутался.

Честно говоря, мне пришлось заглянуть в книгу Стивена Сандерсона. У него есть контрольный список для устранения неполадок при развертывании IIS6. Я знаю, вы говорите, что он терпит неудачу только при использовании MSBuild 4, но он все равно может быть полезен.

Убедитесь, что Default.aspx установлен как страница содержимого по умолчанию. Это могло быть источником 404.

Затем, чтобы иметь URL-адреса без расширений, в прошлый раз, когда я развернул IIS6, я использовал простую карту с подстановочными знаками, и у меня никогда не было проблем ... Если у вас все еще проблемы, извините, что я не смог помочь ... не то, чтобы я не пробовал: ) удачи

person Stéphane    schedule 27.05.2010
comment
Это не влияет на механизм маршрутизации. Это проблема. Несмотря на настройку web.config, IIS, похоже, игнорирует его и возвращает стандартный 404. Включение трассировки IIS показывает, что обработчики маршрутизации и модули не выполняются. - person Agent_9191; 27.05.2010
comment
В ответ на ваше изменение мне понадобился обработчик, когда он был скомпилирован с помощью MSBuild 3.5. В противном случае IIS не знает, что нужно отправить страницу через механизм маршрутизации. - person Agent_9191; 27.05.2010
comment
хм, я немного запутался, потому что сборка вообще ничего не должна менять в части обработки запросов. Кажется, ваша проблема возникает еще до того, как она попадает в ваше приложение. Не могли бы вы проверить, что ваш пул приложений работает в интегрированном режиме? Мне нужно уйти сейчас, но позже я отправлю расширенный ответ. - person Stéphane; 27.05.2010
comment
Пул приложений работает в классическом режиме, потому что на конечном производственном сервере работает IIS6 (как я уже сказал в вопросе), поэтому я стараюсь максимально приблизить его к этому. Как я уже сказал, когда база кода скомпилирована с использованием MSBuild 3.5, она работает должным образом. При компиляции с использованием MSBuild 4 (но все еще ориентированной на платформу 3.5) это вызывает проблему. - person Agent_9191; 27.05.2010

Я столкнулся с этой проблемой сегодня по аналогичному сценарию.

Проблема в моем случае была связана с тем, что было зарегистрировано 32 бита asp вместо 64 бита, что вызвало проблему с маршрутизацией.

Это было решено путем ввода в командной строке следующего

CD c:\windows\microsoft.net\framework64\v4.0.30319
aspnet_regiis -i
person Elfdragore    schedule 10.01.2012
comment
Сначала я изменяю пул приложений на v4.0, что устраняет ошибку, однако ISS не загружала приложение MVC (вместо этого пыталась показать каталог) после выполнения приведенных выше команд (казалось, что установила .net 4) приложение запустилось (то же самое как с использованием сервера разработки Visual Studio). - person Mike Davies; 19.05.2012

Пара идей попробовать

  • Проводили ли вы какое-либо сравнение результатов проектов VS2008 и VS2010? Просто проверяю, что обновление решения ничего не изменило.
  • Установлен ли атрибут targetFramework web.config в элементе compilation? ?
  • Вы уверены, что не сталкиваетесь с чем-то вроде запуска приложения x86 в пуле приложений x64?

Я предполагаю, что у вас все в порядке, но, поскольку у Cassini нет проблем с приложением, я по-прежнему склоняюсь к проблемам с web.config. Правильно ли зарегистрированы ваши модули / обработчики в элементе? Поскольку вы используете классический режим, вам понадобятся как «старый», так и «новый» (ссылка 1, ссылка 2 ).

person Josh    schedule 30.05.2010
comment
в web.config нет targetFramework, но у меня targetFrameworkVersion установлен в самом файле проекта. Поскольку я предварительно компилирую его и развертываю в IIS в обоих сценариях, я не знаю, нужен ли web.config. Что касается выходных данных между ними, трудно провести двоичное сравнение, поскольку я использую Entity Framework, и он должен внести в него некоторые изменения для набора инструментов VS2010. - person Agent_9191; 31.05.2010
comment
Быстрое обновление. Я попытался установить атрибут targetFramework в элементе компиляции, и попытка построить проект привела к тому, что VS2010 сказал, что это не обязательно до ориентации на платформу 4.0. Кроме того, я сомневаюсь, что это проблема x86 и x64, поскольку я компилирую и работаю строго на оборудовании и ОС x86. - person Agent_9191; 01.06.2010
comment
Удачи с регистрацией модуля / обработчика в web.config? Тот выглядел наиболее многообещающим и соответствовал симптомам. - person Josh; 01.06.2010

Я уже выкладывал это решение в другой ветке, но повторюсь. Используйте классический конвейерный режим AppPool:

альтернативный текст

Также не забудьте установить модуль Перенаправление HTTP в Включение или отключение функций Windows.

person Vitaliy Ulantikov    schedule 12.06.2010
comment
Если вы посмотрите мои ответы на @stephanie, вы увидите, что я уже запускаю AppPool в классическом режиме. И если бы вы посмотрели ссылку в вопросе, я сказал, что у меня уже установлены необходимые компоненты (включая перенаправление HTTP). - person Agent_9191; 14.06.2010