首页 > 解决方案 > CORBA 的 ASP.Net WebAPI 替代品?

问题描述

我需要一些关于我正在从事的项目的指导。我们正在寻找 CORBA 服务器设置的替代品。简而言之,我们目前运行一个 CORBA 守护程序服务,该服务托管 10 个 C++ exe 实例,这是我们计算过程的入口点。C++ 代码通过 COM 连接到一堆不同的 .net 和 C++ dll 和 OCX。我们还有另一个版本的可执行文件,它编译为 .dll,我们可以以类似的方式调用它,但它只是一个单实例系统,所以一切都很好。

我们现在正在寻找用 WebAPI 替换 CORBA 组件,因此我整理了一个基本的 ASP.net webAPI 项目,该项目能够将请求处理到这个 C++ dll 中。同样,当它一次只需要处理 1 个请求时,这很有效。当我开始测试并发请求时,事情开始横向发展。请求很好地进入我的处理程序,我可以看到 5 个请求(我到处都记录了正在发生的事情),每个线程都创建了一个 dll 的实例,但它们是同步运行的。

我发现即使 ASP.net 处理程序中有多个线程,dll 也是 STAThreaded(这在代码中得到确认),所以调用排队并且一次只处理 1 个。我的猜测是因为线程都在同一个进程中,所以 dll 将所有线程视为同一个单元(STAThread)并导致队列。

我尝试了不同的 async/await 和 task.run 代码,我可以看到不同的线程,但它仍然归结为使 dll 同步运行的同一进程。我确实尝试通过将 CoInitializeEx(NULL,0x2) 更改为 CoInitializeEx(NULL,0x0) 来将 dll 更改为 MTA,但这似乎并没有改变任何东西。

我现在没有想法了,我认为更改为使用 .exe 版本并产生多个进程不会起作用,因为有 CORBA 的东西允许创建返回对象并将其传回调用代码。我需要能够获取在 exe 中创建的对象以在请求中发回。

很抱歉这篇长文,希望有人能花时间阅读这堵文字墙,并对我可以尝试的方法有所了解。

谢谢!

标签: c#asp.netmultithreadingcomcorba

解决方案


我会建议 WebAPI 体系结构是您的问题的一个糟糕的解决方案。通常,您不想从 ASP.NET 生成长时间运行或阻塞的进程,因为很容易耗尽线程池并阻止服务器处理新请求。

如果您确实想继续使用 WebAPI 端点,我会先接收请求并将它们放入队列中,然后让客户端轮询或订阅完成的结果。

您可能有兴趣了解他们在 dotnetcore 3.0 中使用 gRPC 所做的事情 - 如果您想保留这种架构,但要更新平台。


推荐阅读