Mono和Nginx:StaticFileHadler

时间:2016-04-28 07:05:14

标签: c# asp.net asp.net-mvc nginx mono

我已成功在Ubuntu 14.04上设置 Mono(稳定版4.2.3.4),并使用 NGINX(1.8.1)来托管 ASP.NET MVC < / strong>应用程序,效果很好。我唯一无法解决的是“索引/根(/)404”问题。

我正在使用自定义CustomMvcRouteHandler进行捕获路由:

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

这很好用,所有预期的请求都通过CustomMvcRouterHandler()进行路由; 但不适用于索引(/)。出于任何原因,StaticFileHandler正在为索引请求(/)提供服务并抛出此错误:

System.Web.HttpException :找不到资源。

说明: HTTP 404.您要查找的资源(或其中一个依赖项)可能已被删除,名称已更改或暂时不可用。请查看以下网址,确保拼写正确。

详细信息:请求的网址:/

异常堆栈跟踪:

    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,我的Windows开发机器上运行,甚至在托管相同web应用程序的任何Windows IIS上使用相同的web.config等也能正常工作。即使对于root(/)请求也可以正常工作这些请求通过CustomMvcRouteHandler()进行路由。

我真的不明白为什么Mono使用StaticFileHandler提供索引(/)。如果我在Web结构的根目录中创建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;

这样,root访问权限(/)将更改为/Default.aspx并通过ASP.NET MVC管道进行路由,但当然我需要更改代码并将/Default.aspx视为/.

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在发布问题后一小时后找出解决方案,该死的。

问题在于捕获路由规范并且具有&#34;默认值&#34;参数NULL。以这种方式改变它解决了这个问题:

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

请参阅controller =&#34; Home&#34;,action =&#34; Index&#34;的默认值。指定默认值甚至索引(/)路由由ASP.NET MVC管道提供。

这样做的副作用是,对于&#34;控制器&#34;的RouteData.Values和&#34;行动&#34;被添加到默认值中指定的集合中,因此如果要在代码中添加它们(就像我一样),将抛出异常:

已添加具有相同键的项目。

因此,如果需要,最好检查并删除这些值。

 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上托管时,这些差异很小。)。