2016-04-28 2 views
0

Я успешно установить Mono (Stable 4.2.3.4) на Ubuntu 14.04 с NGINX (1.8.1) для размещения ASP.NET MVC приложений, и он отлично работает. Единственное, что я не могу решить, это проблема «index/root (/) 404».Mono и Nginx: Индекс (/) 404 обслуживается StaticFileHadler

Я использую пользовательский CustomMvcRouteHandler для Catchall маршрута:

routes.MapRoute(
    "UrlHandler", // Route name 
    "{*url}", 
    null, 
    null, 
    new[] { "web.Controllers" } 
    ).RouteHandler = new CustomMvcRouteHandler(); 

Это прекрасно работает и все ожидаемые запросы направляются через CustomMvcRouterHandler(); но не для индекса (/). По какой-либо причине запрос индекса (/) обслуживается StaticFileHandler и генерирует эту ошибку:

System.Web.HttpException: Ресурс не найден.

Описание: HTTP 404. Ресурс, который вы ищете (или его зависимости), мог быть удален, если его имя было изменено или временно недоступно. Просмотрите следующий URL-адрес и убедитесь, что оно написано правильно.

Детали: Запрошенный URL:/

стека исключений трассировки:

at System.Web.StaticFileHandler.ProcessRequest (System.Web.HttpContext context) <0x407e59f0 + 0x00753> in <filename unknown>:0 
    at System.Web.DefaultHttpHandler.BeginProcessRequest (System.Web.HttpContext context, System.AsyncCallback callback, System.Object state) <0x407e5720 + 0x00153> in <filename unknown>:0 
    at System.Web.HttpApplication+<Pipeline>c__Iterator1.MoveNext() <0x408c5000 + 0x04485> in <filename unknown>:0 
    at System.Web.HttpApplication.Tick() <0x408c2730 + 0x00057> in <filename unknown>:0 

Пожалуйста, обратите внимание, что это работает таким образом только на Mono, на мой Dev машине Windows, и даже на каких-либо IIS для Windows хостинг одного и того же веб-приложения с тем же web.config и т. д. работает нормально даже для запросов root (/), и эти запросы маршрутизируются через CustomMvcRouteHandler().

Что я действительно не понимаю, так это то, что Mono обслуживает индекс (/) с помощью StaticFileHandler. Если я создам файл index.html в корневой структуре веб-структуры, то он обслуживается StaticFileHandler (как и ожидалось, потому что статический обработчик файлов ищет этот файл).

Это конфигурационный файл NGINX для сайта:

server { 
    listen 80; 
    listen [::]:80; 
    server_name example.com; 
    access_log /var/www/example.com/logs/access.log; 
    error_log /var/www/example.com/logs/error.log; 

    include /etc/nginx/fastcgi_params; 

    location/{ 
     fastcgi_index /; 
     root /var/www/example.com/www/; 
     fastcgi_pass 127.0.0.1:9000; 
    } 
} 

Обойти я использую сейчас чейнинг строки:

 fastcgi_index /; 

к

 fastcgi_index /Default.aspx; 

Таким образом, корневой доступ (/) изменяется на /Default.aspx и маршрутизируется через конвейер ASP.NET MVC, но, конечно, мне нужно, чтобы ch ange код и обрабатывать /Default.aspx как /.

Любые идеи?

ответ

0

Выяснено решение спустя час после размещения вопроса, черт побери.

Проблема была связана с подробной спецификацией маршрута и параметром «defaults» NULL.Изменение его таким образом решить проблему:

routes.MapRoute(
    "UrlHandler", // Route name 
     url: "{*url}", 
     defaults: new { controller = "Home", action = "Index" }, 
     constraints: null, 
     namespaces: new[] { "web.Controllers" } 
    ).RouteHandler = new CustomMvcRouteHandler(); 

См значения по умолчанию для контроллера = "Home", действие = "Index". При указании параметров по умолчанию даже маршрут index (/) обслуживается конвейером ASP.NET MVC.

Побочный эффект этого заключается в том, что RouteData.Values ​​для «контроллера» и «действия» добавляются в коллекцию, как указано в значениях по умолчанию, поэтому, если вы хотите добавить их в код (как я), исключение будет брошенный:

Товар с таким же ключом уже добавлен.

Так что лучше проверить и удалить эти значения, если это необходимо.

if (requestContext.RouteData.Values.ContainsKey("controller")) 
    requestContext.RouteData.Values.Remove("controller"); 
if (requestContext.RouteData.Values.ContainsKey("action")) 
    requestContext.RouteData.Values.Remove("action"); 

P.S .: Это все о тех небольших различий, когда хостинг на IIS против Mono :).