我已经黔驴技穷了。我正在尝试通过 FastCGI 在 Mono 下运行 ASP.NET MVC 3 网站,并且 Cassette 的 HTTP 处理程序无法正确注册。该网站是http://www.tychaia.com/。
奇怪的是:
- 它在我的本地机器上运行良好。
- 当站点
xsp4
在生产机器上运行时,它工作正常。 fastcgi-mono-server4
当站点在生产机器上运行时,它不能正常工作。
我尝试过的事情:
- 检查 Nginx 配置,确保它传递了所有正确的 FastCGI 参数(它是)。
- 单声道 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 与 URL 不匹配
cassette.axd
,即使它在https://github.com/hach-que/Tychaia/blob/master/Tychaia.Website/Global.asax.cs#L20明确指定(并且它在普通旧 XSP4)。当我为字符串“cassette.axd”(通过doing)添加显式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 实例,但出于性能原因我犹豫不决。
还有什么我可能会在这里遗漏的吗?
编辑:这里有一些应该可以工作的 URL。如您所见,他们正在使用 StaticFileHandler 而不是 Cassette HTTP 处理程序:
- http://tychaia.com/cassette.axd/stylesheet/nDvbK5eAxf6miyaRa_J0vl7YdxA=/Content
- http://tychaia.com/cassette.axd/script/oz4BBh-gK6gJkhB5S64l3mXseFQ=/Scripts
您可以看到,在明确指定 IgnoreRoute 的情况下,cassette.axd
路径确实映射,但只有该路径:
如果你在它的末尾加上一个斜杠,它也不起作用:
编辑 2:我已更新站点以仅链接到/Content/main.css
文件,以便在对该问题进行排序时站点正确显示;如果您在浏览器中检查网络请求,您将看到对 Cassette 捆绑包的失败请求。