5

我在 Visual Studio 2008 中创建了一个 ASP.NET MVC 2 应用程序。我将发布版本设置为通过 ASP.NET 编译器来预编译所有视图、缩小 Javascript 和 CSS、清理 web.config 等。部署将转到 IIS6 服务器,我在我的 Windows 7 机器上设置了我的伪生产部署,以使应用程序池以针对 2.0 运行时的经典模式运行。我在 web.config 中设置了必要的无扩展处理程序,并且一切正常。

当我将解决方案升级到 Visual Studio 2010 时,问题就出现了。 我仍然以 3.5 框架为目标,但现在我使用的是 MSBuild 4.0,因为这是 Visual Studio 2010 使用的。一切仍然可以正确编译,因为它在 Cassini 下运行良好,但是当我将它部署到相同的位置(相同的应用程序池、身份等)时,它现在的行为有所不同。我在 web.config 中仍然有无扩展处理程序,但是现在当我导航到应用程序的根目录时,它会进行目录浏览,并且以前处理过的任何路由现在都返回为 404 错误,由 IIS 中的 StaticFile 处理程序处理. 我不知道发生了什么变化并导致了中断。

我看过这个问题,但我已经验证了所有必备组件都已安装。

4

4 回答 4

3

您是否尝试在服务器上使用Phil Haack 路由调试器调试您的路由?

编辑:
在 IIS 7.5 上,您不需要任何特殊的无扩展处理程序,这是自动处理的,您无需更改任何内容。据我所知,它仅在 IIS 6 上是必需的。这可能是问题吗?如果您删除该特殊处理程序怎么办?也许这就是阻止它启动路由引擎的原因。

编辑:
我仔细检查过,正如我所想,从 IIS7 开始, AppDomain 的默认模式是Integrated Mode。这意味着 Asp.net 堆栈在每次请求时都会启动,而在经典模式下,仅当调用特定扩展时才调用 asp.net(默认情况下,aspx ashx axd 映射到 aspnet_isapi 过滤器)。
UrlRoutingModule在每次请求时都会启动,而不需要您提供任何内容,因为它是 HttpModule 而不是 Handler。(它只需要在你的应用程序的配置文件中注册,不需要将它映射到扩展,但这是默认情况下在 MVC 应用程序中。你可以打开你的 Web.Config 文件并验证你有一个节点

<modules runAllManagedModulesForAllRequests ="true">
...
<add name="UrlRoutingModule" type=.../>
</modules>

您确定将 MVC 程序集部署到服务器吗?检查System.Web.MvcSystem.Web.RoutingSystem.Web.Abstraction引用是否将 Copy Local 属性设置为 true ,以确保您在本地和生产服务器上使用相同的程序集...

如果所有这些都是正确的,我不知道如何为您提供更多帮助......我希望这会对您有所帮助,或者至少让您走上正确的轨道。

编辑: 哇...刚刚阅读您的最后评论...抱歉,我错过了有关经典模式的元素。您的标题提到了 IIS7.5,我假设了太多事情。这就是为什么我感到困惑。

老实说,现在我不得不查看史蒂文·桑德森的书。他有一个用于对 IIS6 部署进行故障排除的清单。我知道你是说只有在使用 MSBuild 4 时才会失败,但它可能仍然有用

检查 Default.aspx 是否设置为默认内容页面。这可能是 404 的来源。

然后有无扩展的 url,上次我部署到 IIS6 时,我使用了一个简单的通配符映射,我从来没有遇到过问题......如果你仍然有麻烦,对不起,我无能为力......不是我没有尝试: ) 祝你好运

于 2010-05-27T05:50:38.223 回答
2

我今天在类似的情况下遇到了这个问题。

我的问题是由于注册了 asp 32 位而不是 64 位,导致路由出现问题。

它是通过在命令提示符下键入以下内容来解决的

CD c:\windows\microsoft.net\framework64\v4.0.30319
aspnet_regiis -i
于 2012-01-10T22:57:46.133 回答
0

Couple ideas to try

  • Have you run any kind of comparison between the output of the VS2008 and VS2010 projects? Just verifying that the solution upgrade didn't change anything.
  • Do you have the web.config targetFramework attribute set on the compilation element?
  • Are you certain you're not running into something like running a x86 application in a x64 app pool?

I'm guessing you're fine on those, but since Cassini has no problems with the application, I still lean toward web.config issues. Do you have your modules/handlers properly registered in the element? Since you're running Classic Mode, you'll need both the "old" and the "new" (reference 1, reference 2).

于 2010-05-30T20:22:12.800 回答
-3

我已经在另一个线程中发布了这个解决方案,但我会重复一遍。使用AppPool 的经典流水线模式:

替代文字

另外不要忘记在Turn Windows features on or off中安装HTTP Redirection模块。

于 2010-06-12T11:01:50.663 回答