我正在使用一个WebForms应用程序,其中添加了一些MVC组件。我们的想法是将越来越多的应用程序转移到MVC,但是它无法一次性转换。由于各种原因我无法控制它必须使用ASP.Net 2.0和MVC 2.0,因为这些都是内置的。我还必须支持IIS 6和IIS 7。
首先,我很清楚无扩展路由的问题,我不试图使用它,因此没有通配符映射等问题。我首先尝试使用我的路由ala“ {controller} .aspx / {action} / {id}“但是在我的头撞到墙上后,我切换到”{controller} .mvc / {action} / {id}“,但我遇到了同样的问题。
其次,即使在我的开发机器上的IIS 7集成模式下,我也无法使用它,更不用说经典模式或IIS 6.它在Cassini下都能正常运行但是一旦我部署到IIS 7,MVC组件就会中断。由于这是在我的开发机器上,我知道ASP.Net已正确注册到IIS,我可以在控制面板中看到所有继承的HTTP处理程序(例如:ASPX映射到PageHandlerFactory)。
症状:
所有ASPX WebForms请求都能完美运行
MVC请求只是控制器没有指定action / id被路由到MVC并正确执行。
对具有操作或ID的MVC路由的任何请求都会立即返回404 。就好像IIS认为“.mvc”扩展名是文件夹路径的一部分所以它忽略了HTTP处理程序并返回404。
换句话说:
/app/WebForm.aspx - HTTP 200 OK,执行WebForm.aspx.cs代码隐藏
/app/Fancy.mvc - HTTP 200 OK,执行/Controllers/FancyController.cs,索引方法
/app/Fancy.mvc/DoThingy - HTTP 404找不到,即使FancyController有DoThingy方法
糟糕的解决方案:我尝试过设置runAllManagedModulesForAllRequests之类的东西,但这不仅对性能有害,而且还会破坏我的Web表单。即使我将其设置为忽略所有带有.ASPX的路线,它们仍然会中断。
我不能使用通配符映射,所以没有帮助。
其他详情: 我在web.config / system.WebServer中设置了HTTP Handler。它是列出的第一个处理程序。
<add name="MvcRoutingHandler" preCondition="integratedMode" verb="*" path="*.mvc" type="System.Web.Routing.UrlRoutingHandler, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" resourceType="Unspecified" />
我指定的处理程序或选项似乎并不重要 - IIS似乎没有检查任何此配置(再次因为它似乎认为路径的Fancy.mvc部分是目录名称,找不到那个目录,然后保释。)
我的路线:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
routes.IgnoreRoute("{resource}.asmx/{*pathInfo}");
routes.IgnoreRoute("{resource}.aspq/{*pathInfo}");
routes.IgnoreRoute("{resource}.svc/{*pathInfo}");
routes.MapRoute("Default",
"{controller}.mvc/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
更新:我尝试使用IIS 7经典模式;然后我在IIS管理器中添加了一个.mvc映射,指向asp_net ISAPI dll并得到了相同的结果
答案 0 :(得分:1)
好的只是让别人看起来不傻,事实证明这是URL的问题...... URL被发送到网站的根目录,而不是app目录。我应该先检查一下。我不认为这是问题所在,因为当我手动将URL输入到地址栏时,它在索引上工作但操作方法需要HttpPost,因此这是因为脚本和手动输入的地址吐出的因素组合相同的错误信息。
对于混合WebForms和MVC的任何其他人,请仔细检查您的网址是否正确。以下是我现在现在在WebForms母版页上使用的一些代码,因此我的客户端JS可以知道在哪里路由MVC请求:
string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority);
if (baseUrl.EndsWith("/")) baseUrl = baseUrl.Substring(0, baseUrl.Length - 1);
baseUrl = baseUrl + ResolveUrl("~/");
Page.ClientScript.RegisterHiddenField("BaseUrl", baseUrl);