4

我试过用几种不同的方式问这个问题,但让我们再试一次(因为我还没有收到答案,这让我发疯了!)

我有一个非常大的经典 ASP 3.0 应用程序(约 350K 行),我想开始迁移到 ASP.NET MVC。我想将旧的 ASP 文件保存在与 MVC 内容不同的项目中。

关于如何调试这些的想法?我是否应该将文件转储到同一个文件夹中并创建两个不同的项目(一个 WAP 和一个 MVC 应用程序)来引用每个项目所需的相关文件和文件夹?这应该可行,但有人有更好的主意吗?我需要能够单独迁移应用程序的一小部分,因为这可能需要一两年才能完成。

4

2 回答 2

4

经过大量研究,我发现从 IIS 的角度来看,将这些项目合并的一个好方法是在 Visual Studio 的单独项目中,将项目创建在同一个文件夹中,但保留每个项目的文件在他们自己的 .csproj 文件中。

通过这种方式,可以将它们单独发布或作为解决方案发布,我可以通过查看解决方案资源管理器轻松判断哪些文件属于每个项目。随着项目从经典 ASP(同样,不是 .NET)移到 MVC 中,我将 ASP 项目中的旧文件夹从 重命名namedelete-me-name并在 MVC 项目中创建相应的区域。

到目前为止,这工作得很好。唯一的其他更改是在 global.asx.cs 文件中添加了一个路由忽略规则以忽略 .asp 文件:

             routes.IgnoreRoute("{resource}.asp/{*pathInfo}");

到目前为止,一切似乎都运行良好。

于 2010-05-12T15:38:22.637 回答
3

免责声明这不在我的脑海中,我从来没有这样做过,并且可能离题:

经过初步审查,我认为您在下面讨论了 3 个替代方案:

  1. 合并为一个应用程序,
  2. 将一个应用程序作为根应用程序,将另一个应用程序作为“子”应用程序
  3. 构建后将合并复制到一个应用程序中(这可能是不可能的)

1)合并到 1 个应用程序为您带来以下好处,相对简单,您需要修改 global.asax - 设置您的 mvc 路由、IOC 等 - HttpApplication、Session 和 Security(假设基于表单)将正常工作。

有一个有点“小”的问题,那就是共享 tempData,如果您可以在页面上实例化 SessionStateTempDataProvider(初始化加载,卸载以保存类似于视图状态),您应该能够创建它,我似乎找不到博客,但认为是几个月前的史蒂夫·桑德森。

您的单元测试/代码覆盖率将很难跟踪,您可能需要考虑管理它的方法,这是一个完全不同的讨论。

2)使用此选项,您将完全分离具有新继承问题的应用程序。如果您的应用程序使用 HttpApplication.* 可能会导致问题,因为它们会引用不同的文件夹、上下文等,但忽略说明您很高兴它们是不同的应用程序

下一个大问题是让 Sessions 工作,现在这可能会非常棘手,如果 session 是 inproc 则每个应用程序都不会看到其他应用程序会话,但是如果您使用 SQL 或自定义缓存服务器来获取会话状态,则应该是能够“破解”程序或引用/配置并在应用程序之间共享会话状态 - 最坏的情况是您需要编写自己的会话提供程序,(我从未编写过,所以不知道这有多难或是否它甚至实用)。

下一个问题是表单身份验证,您可以进行标准单点登录,并确保配置中的 MachineKey 验证和解密密钥相同。临时数据将与选项 1 相同。对我来说,这听起来像是太多的事情要改变,不可行......

3)假设您使用您的 asp.net 站点并添加对 mvc 的引用并添加默认全局 asax 路由等,应用程序仍应构建干净,但在查找 /controller/action/id 类型路由时会引发路由错误,所以你可能需要检查一下。

假设可行,您可以“潜在地”对两个应用程序进行 xcopy 合并(即将 mvc 应用程序中的所有文件复制到 asp.net 应用程序预部署中)。我知道您可以通过创建一个已合并两个应用程序的大项目来做到这一点,但这样代码在构建过程的后期阶段会合并。(签名的程序集,我觉得很麻烦)。再一次,您将需要处理临时数据问题......

我还没有涉及 url 重写和您可能需要考虑的许多其他方面,请注意您可能需要考虑的每种方法都有明显的缺点。

综上所述,我认为您最大的问题将是 mvc 端的 HttpApplication、Session 和 TempData,从 asp.net 端查看状态。Url重写,认证应该更容易。

正如阿甘正传所说,“这就是我的想法”。

于 2010-05-06T22:51:31.390 回答