我有一个遗留网站,它是Classic ASP和WebForms / ASPX的混合体。我想将整个事情迁移到MVC,我的第一个目标是能够将ASP文件的请求路由到新的控制器和视图,因为我将ASP迁移到MVC。我想这样做,以便存在的ASP文件请求由文件本身(传统模式)处理,但我希望能够删除ASP文件并将其功能迁移到控制器和视图,并拥有MVC检测到文件不存在,并路由到控制器。
我试过了:
routes.MapRoute(
"ASP",
"{resource}.asp/{*pathInfo}",
New With {.controller = "Asp", .action = "Index"}
)
但它根本行不通。如果我请求不存在的页面/xyz.asp
,我只需获得404,并忽略该路由。
如何启用我想要的行为?
答案 0 :(得分:0)
受到this related SO question和this post on HttpHandlers by Scott Hanselman的启发,我决定这样做:
我将所有.asp文件移动到名为LegacyAsp
的其他位置我添加了一个名为LegacyAspHandler的HttpHandler,并在web.config中配置它以处理对ASP文件的任何请求:
<add name="LegacyAspHandler" verb="*" path="*.asp"
type="MyNamespace.LegacyAspHandler, MyAssembly" preCondition="managedHandler"/>
在处理程序中,我转换传入的请求路径,它在磁盘上查找文件,以在新位置查找相同的文件:
Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
'the path to the legacy version
Dim sPath = context.Request.PhysicalPath.Replace([OriginalPath], "LegacyAsp")
'if the physical file exists
If System.IO.File.Exists(sPath) Then
'transfer to it
context.Server.TransferRequest(context.Request.RawUrl.Replace([OriginalPath], "LegacyAsp"))
Return
End If
'do the logic that replaces the missing ASP page
'write the result so that the client sees it
context.Response.Write([New Content])
End Sub
这样,如果原始ASP文件存在,则使用它,如果不存在,我们使用新的ASP.NET逻辑。所以我可以保留经典ASP的东西,但是当我将逻辑移植到.NET时,它会无缝切换。