ASP.NET C#外部SDK不是线程安全的

ASP.NET C#外部SDK不是线程安全的,c#,asp.net,iis,activex,C#,Asp.net,Iis,Activex,我在ASP.NET/C中有一个Web API 它使用外部32位ActiveX SDK与第三方应用程序通信 根据我的测试,当我们同时连接两个不同的用户时,SDK会出现问题。第二个连接覆盖第一个连接 如果我在两个cURL循环中调用我的API,一个连接userA,另一个连接userB,在某些情况下,对userA的调用将得到userB的结果 我的代码中没有任何静态变量,没有一个引用SDK的静态变量 我能想到的唯一解决方案是在API为用户获得响应时“锁定”API。还有其他解决办法吗?如果没有,有没有关于如

我在ASP.NET/C中有一个Web API

它使用外部32位ActiveX SDK与第三方应用程序通信

根据我的测试,当我们同时连接两个不同的用户时,SDK会出现问题。第二个连接覆盖第一个连接

如果我在两个cURL循环中调用我的API,一个连接userA,另一个连接userB,在某些情况下,对userA的调用将得到userB的结果

我的代码中没有任何静态变量,没有一个引用SDK的静态变量

我能想到的唯一解决方案是在API为用户获得响应时“锁定”API。还有其他解决办法吗?如果没有,有没有关于如何在C#中执行此操作的指针

API有多个控制器(想想客户/发票/付款/供应商),所有这些控制器都使用相同的SDK。因此,对CustomerController方法的调用也必须锁定对其他控制器的调用

锁只需要在我使用SDK时激活(这可能占请求时间的99%)

编辑1:

SDK名为“Interop.AcoSDK.dll”,它是32位的。VisualStudio将该文件描述为“AcoSDK库”。它是Acomba的SDK,一个会计程序。该程序本身有一个非常古老的结构,其起源可以追溯到80年代的DOS(该程序在当时被命名为Fortune 1000)。与SDK的交互并不现代

我已经将DLL添加到我的项目中,为了使用它,我调用了两个部分


AcoSDKX AcoSDK=新的AcoSDKX();
int version=AcoSDK.VaVersionSDK;
如果(AcoSDK.Start(版本)!=0)
{
抛出新异常(“无法启动SDK”);
}
cie=新的AcombaX();
如果(cie.CompanyExists(config.ciePath)==0)
{
抛出新异常(“未找到公司”);
}
int error=cie.OpenCompany(config.appPath,config.ciePath);
如果(错误!=0)
{
抛出新异常(“未能打开公司:+cie.GetErrorMessage(错误));
}
AcoSDK.User User=新的AcoSDK.User
{
PKey_UsNumber=config.user
};
尝试
{
error=User.FindKey(1,false);
}
抓住
{
抛出新异常(“未能找到用户”);
}
如果(错误!=0)
{
抛出新异常(“未能找到用户”);
}
错误=cie.LogCurrentUser(User.Key\UsCardPos,config.pass);
如果(错误!=0)
{
抛出新异常(“未能登录Acomba:+cie.GetErrorMessage(错误));
}
上面的
cie
属性是类中的
private AcombaX cie

从我的另一个类调用该类来处理与SDK的连接

我的另一个类将其声明为标准对象(非静态)

上面的
config
引用了一个对象,该对象具有API请求所针对的公司/用户的属性。可以拨打多家公司的电话


目前,我的问题是,对于不同的公司,数据最终会被混淆。因此,Company-B的值将显示在Company-A的查询中,例如,当我在cURL中将100个API调用同时循环到两家公司时。它并不是每次都这样做,只是在某些时候,对于某些查询。可能是当调用打开company-B的SDK时,company-a的调用已连接到SDK,但尚未开始请求数据。

您需要共享有关ActiveX SDK的更多信息(实际上没有此类信息)。ActiveX有三种类型

()

ActiveX EXE:与独立的EXE文件不同,ActiveX EXE文件设计为用作OLE服务器,而OLE服务器只不过是设计用于与其他程序共享信息的程序。它有一个.EXE文件扩展名

ActiveX DLL:ActiveX DLL文件不打算自己使用。相反,这些类型的文件包含设计用于在创建独立程序时充当构建块的子程序。它有一个.DLL文件扩展名

ActiveX控件:与ActiveX DLL或ActiveX EXE文件不同,ActiveX控件文件通常提供子程序和用户界面,您可以在其他程序中重用。它具有.OCX文件扩展名

基于SDK的格式和使用方式,可能有一些解决方案可以使调用并行

用一些代码、例子等更新这个问题,可能会让我有更多的了解


这可能是启动多个应用程序而不是一个应用程序,并将它们用作一个池,从同一个库中创建多个对象等等。

我发布了一条评论,要求澄清;我希望您正处于开发阶段,可以重新设计此功能

通常,ASP.NET对于非平凡的同步进程来说非常糟糕。线程池很容易耗尽,当从“桌面”或RPC体系结构移动时,您所描述的并发问题并不少见


我强烈建议将此类操作的WebAPI/ASP.NET体系结构更改为基于队列/任务的方法。客户端提交任务,然后轮询/订阅完成结果。这将允许您将后端设计为以任何必要的方式运行,以防止由于共享库而导致的数据损坏问题。也许每个处理请求的公司都有一个长期存在的后端进程—我不太了解您的需求,无法提出明智的建议,但您在这里有很多选择。

我想您是在问并发问题吧?如果是这样,我认为ActiveX部分与此无关。您需要在乐观方法和悲观方法之间做出选择。(试图记录