HTTP处理程序未在Mono MVC 3下正确注册

时间:2013-05-05 12:25:28

标签: nginx mono httphandler fastcgi

我在我的智慧结束。我试图通过FastCGI在Mono下运行ASP.NET MVC 3网站,而Cassette的HTTP处理程序将无法正确注册。该网站为http://www.tychaia.com/

奇怪的是:

  • 它在我的本地机器上运行良好。
  • 当网站在生产计算机上的xsp4下运行时,它可以正常工作。
  • 当网站在生产计算机上的fastcgi-mono-server4下运行时,它无法正常工作。

我尝试过的事情:

  • 检查Nginx配置,确保传入所有正确的FastCGI参数(确实如此)。
  • Mono 3.0.7和3.0.10。一位朋友在3.0.7下工作,但对我来说没有骰子。

这是特殊的Web.config条目:

<add path="cassette.axd" verb="*" type="Cassette.Aspnet.CassetteHttpHandler, Cassette.Aspnet" />

https://github.com/hach-que/Tychaia/blob/master/Tychaia.Website/Web.config#L47

据我所知,我有两个导致此问题的问题:

  • MVC的IgnoreRoute与cassette.axd URL不匹配,即使它在https://github.com/hach-que/Tychaia/blob/master/Tychaia.Website/Global.asax.cs#L20明确指定(并且它在普通的旧XSP4下工作)。当我为字符串“cassette.axd”添加一个显式的IgnoreRoute(通过做routes.IgnoreRoute("cassette.axd");)时,它会开始传递给处理程序,除了:
  • 服务器的HTTP处理程序路径匹配似乎只在FastCGI下进行完全匹配。即使我关闭了站点中的所有MVC注册,处理程序也仅匹配cassette.axd,即使这样处理程序似乎没有任何路径信息。
  • 当我添加其他条目如<add path="cassette.axd/*" verb="*" type="Cassette.Aspnet.CassetteHttpHandler, Cassette.Aspnet" />时,这些条目也开始由处理程序处理,但它不会像通常那样在该URL处响应;您只需获取默认值,就好像没有其他URL参数(可能是HTTP处理程序路径匹配正在使用它们)。

目前FastCGI的设置方式是:

  • 主要的Nginx实例,它只是更多Nginx实例的反向代理(我运行多个站点,我喜欢将它们隔离)。它指示:
  • http://tychaia.com/的Nginx实例,它通过UNIX套接字调用FastCGI。

同样,在XSP4下不会发生此问题,只有 在FastCGI下发生。虽然我可以将此代理反向代理到XSP4实例,但出于性能原因,我对此犹豫不决。

还有什么我可以在这里找不到的吗?

编辑:以下是一些应该有效的网址。如您所见,他们正在使用StaticFileHandler而不是Cassette HTTP处理程序:

您可以看到,明确指定了IgnoreRoute,cassette.axd路径会映射,但只有该路径:

如果你在它的末尾放一个斜杠,它就不起作用:

编辑2 :我已将网站更新为仅链接到/Content/main.css文件,以便在此问题排序时网站正确显示;如果您在浏览器中检查网络请求,您将看到对Cassette捆绑包的失败请求。

1 个答案:

答案 0 :(得分:3)

我已经在Mono bug跟踪器上提交了一个错误,希望能够找到解决这个问题的原因:

https://bugzilla.xamarin.com/show_bug.cgi?id=12190

更新:我找到了问题的原因。在OpenSUSE下,mono和XSP是单独打包的。即使我将Mono升级到3.0.10,XSP / FastCGI仍然保持在版本2.10.2.0。当我将XSP / FastCGI软件包升级到2.11.0.0时,问题就消失了。