0

我正在开发一个新网站,使用 ASP.NET MVC2 用 VB.Net 编写,需要为各种复杂的业务逻辑位调用“遗留”VB6 代码。VB6 是一个由许多 dll 组成的框架,并且是非常有状态的,我们几乎模拟了在我们的客户端应用程序中如何使用框架,即应用程序运行(大量状态设置),用户登录(甚至更多状态)和然后加载一个文件(甚至更多状态)。

我已经获得了一个“Web 服务接口框架”来启动并运行它以在 Web 应用程序中使用,这个“Web 框架”将遗留代码隐藏在 IIS 下运行的薄层后面。这个想法是 IIS 提供的线程池将减少内存使用等。我不禁相信提供这个的人没有抓住重点,因为每个实例都是有状态的,所以线程池无法工作,因为一旦用户使用池中的一个特定对象登录,则没有其他对象能够为该客户端提供服务(因为它不会有状态)!此外,与直接调用对象相比,添加 Web 服务接口和关联的 SOAP 编组是一个巨大的开销。

我能想到的唯一方法是一个单一的遗留接口实例,它被所有客户端使用并被每个调用阻塞直到它完成,或者每个客户端一个线程,每个遗留接口对象都在一个新线程中创建并为客户的生活。

这些都不是理想的,但是由于有问题的代码量以及向 .net 的长期迁移计划(2 年以上并且仍然是有状态的),我想不出替代方案。我们为一些客户在 citrix 环境中运行原始客户端应用程序,因此我希望它也可以在每个客户端运行良好的线程给定足够强大的服务器,并且框架本身的开销应该低于涉及客户端应用程序时的开销。

有任何想法吗??

4

2 回答 2

1

我建议你看看这个框架Visual WebGui。我是这家公司的一名员工,因此听起来并不客观,但我相信 Visual WebGui 已经解决了扩展有状态应用程序和将单用户环境转变为多用户环境的一些主要问题。值得一看。

于 2010-08-25T11:15:44.663 回答
0

这是一个选项,但它不会很漂亮。

听起来您需要将长期存在的对象(有状态对象与后端层)与各个用户相关联。

可以将此对象存储在应用程序状态中,并将其与用户会话状态与一个键相关联。您需要提供一个包装器来跟踪它们。当会话终止时,您可以捕获事件并销毁后端对象。

应用程序状态是一个键/值存储,就像 Session 一样。您可以通过HttpContext.Application

最大的缺点是您放入其中的对象会一直存在,直到您销毁它们,因此您的包装器和会话破坏代码需要被发现。除此之外,这可能是一种快速启动和运行的方法。

就像我说的那样,它不会是最佳的,但它可能会起作用。

有关影响的更多信息:http: //msdn.microsoft.com/en-us/library/bf9xhdz4 (VS.71).aspx

编辑:

您也可以在网络场环境中进行这项工作。将重新创建有状态遗留对象所需的信息存储在会话状态中,这些信息可以使用内置的 SQL 提供程序在机器之间共享。如果用户退回到该对象不存在的服务器,则您的应用程序状态包装器可以从会话状态信息中重新创建它。

这只是留下了如何在不需要的服务器上清理有状态对象。在您的检索包装器中,每次访问给定的有状态对象时,使用访问时间更新哈希表或其他内容。在包装器中进行定期清理例程,以销毁自比 Web 应用程序的会话超时值稍多一点以来未访问过的有状态对象。

于 2010-07-22T12:29:47.410 回答