У нас есть C # WebMethod, который синхронно вызывается CGI в Delphi (не спрашивайте!). Это работает хорошо, за исключением случаев, когда мы переключаемся на нашу среду аварийного восстановления, которая работает намного медленнее. Проблема заключается в том, что веб-запрос Delphi WinInet имеет тайм-аут 30 секунд, который нельзя изменить из-за ошибки, подтвержденной Microsoft. В среде аварийного восстановления WebMethod C # может занимать более 30 секунд, а Delphi CGI падает прямо на лицо.
Теперь мы запрограммировали C # WebMethod для распознавания среды, в которой он находится, и если он находится в режиме аварийного восстановления, мы вызываем последующий метод в потоке и немедленно отвечаем на CGI, чтобы он находился в течение 30 секунд. , Это имеет смысл в теории, но мы находим, что эти многопоточные вызовы ошибочны и не выполняются 100% времени. Мы достигаем 70% успеха.
Это явно неприемлемо, и мы должны довести его до 100%. Потоки вызываются с помощью Delegate.BeginInvoke (), которое мы успешно использовали в других контекстах, но им это почему-то не нравится… очевидно, что EndInvoke () нет, потому что нам нужно немедленно ответить на CGI и это конец WebMethod.
Вот упрощенная версия WebMethod:
[WebMethod]
public string NewBusiness(string myParam)
{
if (InDisasterMode())
{
// Thread the standard method call
MethodDelegate myMethodDelegate = new MethodDelegate(ProcessNewBusiness);
myMethodDelegate.BeginInvoke(myParam, null, null);
// Return 'ok' to caller immediately
return 'ok';
}
else
{
// Call standard method synchronously to get result
return ProcessNewBusiness(myParam);
}
}
Есть ли какая-то причина, по которой такой вызов «запускай и забывай» потерпит неудачу, если его использовать в среде WebService WebMethod? Если так, то есть ли альтернатива?
К сожалению, изменение стороны Delphi для нас не вариант - решение должно быть на стороне C #.
Буду признателен за любую помощь, которую вы сможете оказать.