如何找到大型 .NET 应用程序的未使用部分?

How to find unused parts of a large .NET application?

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

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

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

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

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

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

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

不过你也可以事后发现问题。在菜单中,您会找到条目 "ReSharper > Inspect > Code Issues in Solution"。 它将创建一个报告,您可以在 "Redundancies in Code".

下找到它

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

同时检查事件日志。有时会出现 'Directory does not exist' 之类的消息,这可能意味着该服务已多年不工作,但没有人注意到。并检查冗余应用程序,也许应用程序在多个服务器上处于活动状态。

在 table 秒内查看最近条目的时间指示和登录信息。

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

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

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

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

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

-- 更新--

可能有可用的日志记录,但收集、阅读和解释可能既费力又费时。为了更容易监控,您可以考虑以下内容:

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

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

我认为这足以进行初步分析。然后是解释日志。也许您会看到一种合并日志的方法,这样您就可以 link 对某些数据库操作发出请求,而无需查看或更改代码。一些想法。