我正在将一些旧的aspx页面迁移到一个闪亮的基于MVC的新架构。但是,在转换过程中,我仍然需要支持旧路由,只需重定向或呈现相关的mvc操作。
我遇到的问题是,用于处理多种用途的1个aspx现在是多个MVC操作。
我认为我可以使用自定义RouteBase:
routes.Add("legacy", new LegacyPageOverride());
看起来像:
public override RouteData GetRouteData(HttpContextBase httpContext)
{
if (httpContext.Request.Headers == null)
return null;
if (httpContext.Request.Url == null)
return null;
if (httpContext.Request.Url.AbsolutePath.StartsWith("/legacy/login/default.aspx", StringComparison.OrdinalIgnoreCase))
return LoginRoute(httpContext.Request);
return null;
}
private RouteData LoginRoute(HttpRequestBase httpRequestBase)
{
if (httpRequestBase?.Url == null)
throw new ArgumentNullException(nameof(httpRequestBase));
var routeData = new RouteData(this, new MvcRouteHandler());
routeData.Values.Add("controller", "Account");
if (httpRequestBase.Form["SAMLResponse"] != null ||
httpRequestBase.QueryString["SAMLResponse"] != null)
{
routeData.Values.Add("action", "SAML");
}
else if (httpRequestBase.QueryString["logged_out"] != null)
{
routeData.Values.Add("action", "logoff");
}
else
{
routeData.Values.Add("action", "SignIn");
}
return routeData;
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
return null;
}
我已经调试过了,但是虽然这个逻辑正在触发,而GetRouteData正在返回一个RouteData对象,但我仍然收到了404.
我试过了:
routes.RouteExistingFiles = true(和false)。
删除我试图覆盖路径的文件。
尝试从web.config中删除staticFile模块。
我无法使用UrlRewriting,因为我无法在托管该网站的所有网络服务器上安装该模块。我还需要根据POST参数进行路由,并将这些参数重新提交到结果页面。
更新
我把它缩小到属性路由。如果我在特定的控制器操作上禁用它,一切正常。
所以这不起作用: 〔路线(“登录)] public ActionResult Login()
这样做: public ActionResult Login()
任何想法如何使它工作?我读了一些MS_DirectRouteMatches?