【问题标题】:How to find unused parts of a large .NET application?如何找到大型 .NET 应用程序的未使用部分?
【发布时间】:2016-11-16 11:38:44
【问题描述】:

考虑一个大型的多层企业 Web 应用程序和许多功能非常复杂的服务,主要在服务器端用 .NET (C#) 编写,在客户端显然是 html 和 javascript,由数百页组成,数量为服务调用(操作)数以千计,托管在多台服务器上,开发时间超过 15 年。有些部分是非常新的和现代的,其他部分是遗留的。

此应用程序的某些部分已过时,实际上没有人再使用这些部分了。无论这些是整个未使用的子应用程序、未使用的页面、文件、服务调用、方法还是代码行,都无关紧要。较旧的部分不提供任何使用统计信息,但使用依赖注入。

如何自动根据对生产服务器的访问,在不更改实际源代码的情况下找出未使用的部分?所以问题不在于找到未引用/无法访问的代码。这是关于寻找用户实际上不再使用的部分。

一个选项可能是查看查询日志。这会发现未使用的页面,但很难(繁琐的手动过程)找出后台中的哪些部分被那些页面使用。

另一个选项可能是监视服务器上的文件访问。那有意义吗?这样可行吗?

另一个想法是做一些类似于测试覆盖工具所做的事情,但不是在测试期间。假设调试符号可用,是否可以在实时 C#.NET 应用程序中测量覆盖率(类似于执行的代码行)?

【问题讨论】:

  • 我认为如果没有适当的日志记录或跟踪,这是不可能的。也许您可以附加一个分析器,但这只会告诉您性能和内存使用方面的瓶颈。
  • 有多种方法,但一种常见的方法类似于 Azure 中的 Application Insights,开发人员从应用程序中明确收集使用数据,然后分析哪些功能从未使用过,azure.microsoft.com/en-us/services/application-insights

标签: c# .net obsolete


【解决方案1】:

在不真正了解情况的情况下很难给出答案。但是,我认为没有一些自动或简单的方法。我不知道最好的解决方案,但我可以告诉你我会怎么做。我会首先从(IIS?)服务器收集所有日志文件(至少一年,代码可以每年使用一次)并分析这些文件。这应该让您最好地了解哪些部分是在外部调用的。你有那些日志吗?

还要检查事件日志。有时会出现“目录不存在”之类的消息,这可能意味着该服务多年来无法正常工作,但没有人注意到。并检查冗余应用程序,也许应用程序在多个服务器上处于活动状态。

检查带有时间指示和日志信息的表内是否有最近的条目。

检查文件上的日期并分析数据库可能会提供额外的信息,但我认为这不会真正有帮助。

根据用户输入或应该过时的应用程序,列出您认为过时的所有应用程序。

使用您的发现根据应用程序/代码已过时的概率创建一个列表。根据您的列表,接下来的步骤可能是:

  • 删除冗余应用程序。
  • 查找文件系统数据模型中的更改并检查这些更改是否仍与代码匹配。
  • 分析数据库中的无效查询。这可能表明数据模型已更改,导致应用程序停止工作。如果没有人注意到,则此应用程序或功能已过时。
  • 在您有疑问的代码中添加日志记录。
  • 查看应用程序级别,首先将调用标记为过时、注释/删除未使用的代码或重定向到(新)等效代码。
  • 关闭应用程序并监控发生的情况。如果存在依赖项,那么您可以采取措施删除此依赖项或选择让应用程序继续存在。

监控您的行为的影响将帮助您解决问题。我希望这个答案能给你一些想法。

-- 更新--

可能有可用的日志记录,但收集、阅读和解释可能既困难又耗时。为了便于监控,您可以考虑以下方法:

  • 监控数据库:您可以使用分析器工具,但创建一个触发器可能更容易,该触发器使用您需要的所有信息记录所有 CRUD 操作。创建一个程序,可以读取数据库的方案,并按表、存储过程、视图过滤日志,以确定未使用的内容。我没有调查,但也许你也可以监控回滚和异常。

  • 监控 IIS。当然有日志文件,但您也可以考虑向网站添加一个模块,您可以在其中编写自定义代码来监控您想要的任何内容。所有流量都通过模块。看看这里:https://www.iis.net/learn/develop/runtime-extensibility/developing-iis-modules-and-handlers-with-the-net-framework。如果我没记错的话,您只需将模块添加到网站并配置网站以使用该模块。创建一个程序,对登录的url、状态、ip、标识等进行过滤,判断使用的是什么。

我认为这足以进行第一次分析。然后是解释日志。也许您会看到一种组合日志的方法,这样您就可以将请求链接到某些数据库操作,而无需查看或更改代码。只是一些想法。

【讨论】:

  • 感谢您抽出宝贵的时间提供意见,这是关于可以手动完成的内容,绝对赞成。 :) 我正在尝试找出是否有一种方法可以尽可能多地实现自动化,以及潜在自动化的最佳方法是什么,希望收集一些想法来帮助解决这方面的问题,但恐怕你是对的,它不能自动完成。尽管我认为这在理论上并非不可能,但将其自动化也可能是一种产品。 :) 给定生产服务器进程和环境以及调试符号应该允许运行时分析。
  • 也许我还有一些其他的想法。您是否使用 IIS,是否有使用实体框架的部分?您需要历史数据还是有时间监控一段时间?
  • IIS,是的。有些零件使用EF。假设我有时间监控一年。
  • 此外,您可以创建或找到一个工具来从服务器的事件日志中收集条目,从而提供额外的信息。
【解决方案2】:

您可以使用 ReSharper。它会在你编码时告诉你这些问题。

不过,您也可以事后发现问题。在菜单中,您将找到“ReSharper > Inspect > Code Issues in Solution”条目。 它将创建一个报告,您可以在“代码冗余”下找到它。

【讨论】:

  • 谢谢,我的意思不同,我会编辑问题,抱歉。我的意思不是根本不调用代码,我指的是应用程序的某些部分没有被用户实际使用。所以几乎所有的代码都被引用了,它只是旧的,不再被人们使用了。
猜你喜欢
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 2011-05-06
  • 2017-11-12
  • 1970-01-01
  • 2017-08-10
相关资源
最近更新 更多