c# - 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 中创建的对象以在请求中发回。
很抱歉这篇长文,希望有人能花时间阅读这堵文字墙,并对我可以尝试的方法有所了解。
谢谢!
解决方案
我会建议 WebAPI 体系结构是您的问题的一个糟糕的解决方案。通常,您不想从 ASP.NET 生成长时间运行或阻塞的进程,因为很容易耗尽线程池并阻止服务器处理新请求。
如果您确实想继续使用 WebAPI 端点,我会先接收请求并将它们放入队列中,然后让客户端轮询或订阅完成的结果。
您可能有兴趣了解他们在 dotnetcore 3.0 中使用 gRPC 所做的事情 - 如果您想保留这种架构,但要更新平台。
推荐阅读
- jtag - Atollic TrueStudio 中调试程序的问题
- javascript - 如何管理列表中的 Angular 元素更新
- python - mpmath 函数 hyperu 的默认精度是多少?
- flutter - WebView不能在flutter中加载两个不同的url?
- regex - 如何在 ruby 的正则表达式中对特殊字符和字母进行分组?
- dependency-injection - 如何从另一个程序集配置 Asp.Net 核心 WebAPI 中的服务
- reactjs - 将 JSX 元素声明为子元素
- reporting-services - 根据日期字段过滤 Tablix
- python - 如何从具有不同长度列表的字典中创建字典列表
- r - R 中的标准函数(如 substr)已调试,我不感兴趣