我已成功在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视为/.
有什么想法吗?
答案 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上托管时,这些差异很小。)。