ASP.Net WebAPI替代CORBA?

问题描述 投票:3回答:2

我需要有关我正在从事的项目的一些指导。我们正在寻找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.net multithreading com corba
2个回答
0
投票

我建议WebAPI体系结构不能很好地解决您的问题。通常,您不想从ASP.NET产生长时间运行或阻塞的进程,因为耗尽线程池并阻止服务器能够处理新请求非常容易。

如果您确实希望继续拥有WebAPI端点,那么我将从接收请求并将其放入队列,然后让客户端轮询或订阅完成的结果开始。

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


0
投票

您可以创建多个应用程序域。应用程序域是“可以认为是既是容器又是边界的轻量级进程” ref。将DLL加载到该不同的域中。这样,您创建的每个应用程序域都将分别加载COM DLL。使用MarshalByRefObject使用here创建代理。编写一个协调程序,将请求分发到应用程序域,并从应用程序域中获取结果并发送响应。跟踪哪个域不忙,或者为请求创建新域。

© www.soinside.com 2019 - 2024. All rights reserved.