У нас есть старая сторонняя система (назовем ее Junksoft® 95), с которой мы взаимодействуем через PowerShell (она предоставляет COM-объект), и я нахожусь в процессе ее оборачивания в REST API (ASP). NET Framework 4.8 и WebAPI 2). Я использую пакет System.Management.Automation
nuget для создания PowerShell
, в котором я создаю экземпляр COM API Junksoft в качестве dynamic
объекта, который затем использую:
//I'm omitting some exception handling and maintenance code for brevity
powerShell = System.Management.Automation.PowerShell.Create();
powerShell.AddScript("Add-Type -Path C:\Path\To\Junksoft\Scripting.dll");
powerShell.AddScript("New-Object Com.Junksoft.Scripting.ScriptingObject");
dynamic junksoftAPI = powerShell.Invoke()[0];
//Now we issue commands to junksoftAPI like this:
junksoftAPI.Login(user,pass);
int age = junksoftAPI.GetAgeByCustomerId(custId);
List<string> names = junksoftAPI.GetNames();
. Это прекрасно работает, когда я запускаю все это в том же потоке (например, в консольном приложении). Однако по какой-то причине это обычно не работает, когда я помещаю junksoftAPI
в System.Web.Caching.Cache
и использую его с разных контроллеров в моем веб-приложении. Я говорю обычно , потому что это действительно работает, когда ASP. NET происходит, чтобы дать входящий вызов потоку, в котором был создан junksoftAPI
. Если этого не произойдет, Junksoft 95 выдаст мне ошибку.
Можно ли как-нибудь убедиться, что все взаимодействия с junksoftAPI
происходят в том же потоке ?
Обратите внимание , что я не хочу превращать целое веб-приложение в однопоточное приложение! Логика c в контроллерах и т. Д. Должна происходить как обычно на разных потоках. Это должно быть только взаимодействие Junksoft, которое происходит в потоке Junksoft-speci c, что-то вроде этого:
[HttpGet]
public IHttpActionResult GetAge(...)
{
//finding customer ID in database...
...
int custAge = await Task.Run(() => {
//this should happen on the Junksoft-specific thread and not the next available thread
var cache = new System.Web.Caching.Cache();
var junksoftAPI = cache.Get(...); //This has previously been added to cache on the Junksoft-specific thread
return junksoftAPI.GetAgeByCustomerId(custId);
});
//prepare a response using custAge...
}