【问题标题】:Classic ASP and MVC side-by-side, different projects?经典的 ASP 和 MVC 并排,不同的项目?
【发布时间】:2011-02-16 11:25:25
【问题描述】:

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

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

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

【问题讨论】:

  • 您是在尝试将应用程序整体转换为 ASP.NET MVC,还是通过一次将一个片段转换为 MVC 来“拥抱和扩展”旧应用程序?
  • “拥抱和扩展”可能最能描述我所追求的。例如,我们在 /forum 文件夹中有一个 ASP 论坛。我想在 MVC 项目中创建一个名为“论坛”的区域,并从 ASP 站点中删除相同的文件夹,然后让 MVC 论坛接管。对于这样大小的网站,唯一的方法就是一次一个。

标签: asp.net-mvc asp-classic projects-and-solutions migrate


【解决方案1】:

免责声明这不是我的想法,我从来没有这样做过,可能离题:

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

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

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

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

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

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重写,认证应该更容易。

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

【讨论】:

  • 感谢您非常详细的回复。我实际上是在将一个经典的 ASP 应用程序(不是 .net)与 MVC 结合起来,但我认为你在这里提到的所有内容仍然适用。
  • 我们正在尝试做同样的事情,经典的 ASP 和 ASP.NET MVC4,但到目前为止没有运气,这些想法对我们没有用。我们需要将它们放在同一个应用程序域中,以便它们可以看到相同的 cookie。任何可以向我指出一些有用信息的人的奖励积分。谢谢,彼得
  • 看看我回答的关于在此处共享 cookie 的问题stackoverflow.com/questions/2797412/single-sign-on-asp-net-mvc/…
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 经典asp和asp.net mvc之间的Session传输/共享是怎么处理的?
  • 我们不使用会话。如果你有不止一台服务器,它永远不会结束。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 2013-05-17
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
相关资源
最近更新 更多