Развертывание приложения MVC2 на IIS7.5 - Ninject попросил предоставить контроллеры для файлов содержимого - PullRequest
0 голосов
/ 29 апреля 2010

У меня есть приложение, которое начало свою жизнь как приложение MVC (1.0) в Visual Studio 2008 Sp1 с кучей проектов Silverlight 3 в составе сайта. Ничего особенного. Использование Ninject для внедрения зависимостей (первая бета-версия 2, теперь выпущенная версия 2 с расширениями MVC).

С выпуском .Net 4.0, VS2010, MVC2 и т. Д. Мы решили переместить приложение на новейшую платформу. Мастер преобразования в VS2010, очевидно, позаботился обо всем, за одним исключением - он не изменил ссылки на mvc1, чтобы теперь указывать на mvc2, поэтому мне пришлось сделать это вручную. Конечно, это заставляет меня задуматься о других вещах MVC2, которые могли бы отсутствовать в моем приложении, что было бы там, если бы я сделал File -> New Project ... Но это не главное в этом вопросе.

Когда я развертываю это приложение на сервере IIS 7.5 (работает на Win2008 R2 x64), приложение как таковое работает. Однако изображений, сценариев и другого статического содержимого, похоже, не существует. Конечно, они есть на диске на сервере, но они не отображаются в клиентском веб-браузере.

Я довольно новичок в IIS, поэтому я знал только одну хитрость - попытаться открыть веб-страницу в браузере на сервере, поскольку это может дать мне больше информации. И вот, наконец, мы встречаемся с нашим врагом. Если я пытаюсь перейти непосредственно к URL-адресу одного из изображений (например, http://server/Content/someimage.jpg), в браузере появляется следующая ошибка:

IControllerFactory 'Ninject.Web.Mvc.NinjectControllerFactory' не вернул контроллер для контроллера с именем 'Content'.

Aha. Веб-сервер пытается передать этот запрос в MVC, который с его настройкой маршрутизации по умолчанию предполагает, что Content является контроллером, и завершается неудачей.

Как я могу заставить его рассматривать Content / и Scripts / (среди прочего) как неконтроллерные и просто проходить через статический контент? Это, конечно, работает с Cassini на моей машине разработчика, но как только я разверну, эта проблема решается.

Я использую последнюю версию Ninject MVC 2, где инструмент IoC должен передавать недостающие контроллеры фабрике базовых контроллеров, но это, очевидно, не помогло. Я также попытался добавить маршруты игнорирования для Контента и т. Д., Но это, по-видимому, также не имеет никакого эффекта. Я даже не уверен, что решаю проблему на правильном уровне.

Кто-нибудь знает, где искать это приложение? У меня есть полный контроль над веб-сервером, поэтому я могу более или менее делать с ним все, что захочу, пока он начинает работать.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 02 мая 2010

У меня была похожая проблема с StructureMap и favourite.ico, что я закончил тем, что сделал, чтобы добавить маршрут, чтобы игнорировать этот путь.

        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("favicon.ico");

Имейте в виду, что я на самом деле абсолютно не представляю, но другая вещь, которая изменилась, - это необходимость в Default.aspx, также, если у вас есть какие-то пользовательские страницы, которые необходимо отобразить. Это единственные две проблемы, которые у меня были с маршрутизацией.

        routes.RouteExistingFiles = false;

РЕДАКТИРОВАТЬ: Я имел в виду, что RouteExistingFiles должен быть ложным, в противном случае я получаю это исключение в MVC2:)

1 голос
/ 08 мая 2010

Оказывается, это было вызвано некоторыми настройками учетной записи - я не знал, что учетная запись IIS AppPool \ sitename автоматически создается IIS на сервере Win2008 R2. Попробовав «все», я наткнулся на эту информацию, дал соответствующие права, и все волшебным образом начало работать.

Довольно сложная для отладки вещь, особенно для человека (меня) с очень ограниченным опытом работы с IIS.

...