我正在开发一个使用ASP.NET MVC2用VB.Net编写的新网站,需要为各种复杂的业务逻辑调用“遗留”VB6代码。 VB6是一个由许多dll组成的框架,非常有状态,我们几乎仿效框架在我们的客户端应用程序中的使用方式,即应用程序运行(许多状态设置),用户登录(甚至更多状态)和然后加载一个文件(更多的状态)。
我已经获得了一个“Web服务接口框架”,以便在Web应用程序中使用它,这个“Web框架”隐藏了在IIS下运行的薄层背后的遗留代码。这个想法是由IIS提供的线程池将减少内存使用等等。我不禁相信提供这个的人错过了这一点,因为每个实例都是如此有状态,线程池无法工作,因为一旦用户使用池中的一个特定对象登录,没有其他对象能够为该客户端提供服务(因为它没有状态)!此外,与直接调用对象相比,添加Web服务接口和关联的SOAP编组是一个巨大的开销。
我能想到这样做的唯一方法是一个遗留接口实例,它被所有客户端使用并被每个调用阻塞直到它完成,或者每个客户端的一个线程,每个传统接口对象都在一个新线程中创建并为客户的生活而生活。
这些都不是理想的,但是有问题的代码量和延长的迁移程序到.net(2年以上仍然是有状态的)我想不出替代方案。我们在一个Citrix环境中为一些客户运行原始客户端应用程序,所以我希望它也可以运行正确的每个客户端的线程给定一个足够强大的服务器,并且框架本身的开销应该低于涉及客户端应用程序时的开销。
任何想法??
答案 0 :(得分:1)
我建议你看看这个框架Visual WebGui。我是这家公司的员工,因此不会客观,但我相信Visual WebGui解决了扩展状态应用程序并将单个用户环境转变为多用户环境的一些主要问题。值得一看。
答案 1 :(得分:0)
这是一个选项,但它不会很漂亮。
听起来您需要将长期存在的对象(有状态对象与后端层)与单个用户相关联。
您可以将此对象存储在应用程序状态,并使用密钥将其与用户会话状态相关联。您需要提供一个包装器来跟踪它们。当会话终止时,您可以捕获事件并销毁后端对象。
应用程序状态是一个键/值存储,就像Session一样。您可以通过HttpContext.Application
对此的大挫折是你放在那里的物体会一直徘徊,直到你摧毁它们,所以你的包装和会话破坏代码需要被发现。除此之外,这可能是一种快速启动和运行的方式。
就像我说的那样,它不会是最佳的,但它可能会起作用。
有关影响的更多信息: http://msdn.microsoft.com/en-us/library/bf9xhdz4(VS.71).aspx
编辑:
您还可以在Web场环境中进行此操作。存储在会话状态中重新创建有状态遗留对象所需的信息,可以使用内置SQL提供程序在计算机之间共享。如果用户跳转到对象不存在的服务器,则应用程序状态包装器可以从会话状态信息中重新创建它。
这就是如何清理不需要它的服务器上的有状态对象。在您的检索包装器中,每次访问给定的有状态对象时,都会更新哈希表或具有访问时间的内容。在包装器中定期清理例程会破坏未被访问的有状态对象,因为它比Web应用程序的会话超时值略高。