Abbiamo un WebMethod C# che viene chiamato in modo sincrono da un CGI Delphi (non chiedere!). Funziona bene, tranne quando passiamo al nostro ambiente di disaster recovery, che funziona molto più lentamente. Il problema è che la richiesta web WinInet di Delphi ha un timeout di 30 secondi, che non può essere modificato a causa di un bug riconosciuto da Microsoft. Nell'ambiente di disaster recovery, C# WebMethod può impiegare più di 30 secondi e il CGI Delphi cade in superficie.C# Fire and Forget call in a WebMethod
Abbiamo ora codificato il WebMethod C# per riconoscere l'ambiente in cui si trova e, se è in modalità di ripristino di emergenza, chiamiamo il metodo successivo in un thread e rispondiamo immediatamente al CGI in modo che rientri nei 30 secondi. Questo ha senso in teoria, ma stiamo scoprendo che queste chiamate a thread sono irregolari e non vengono eseguite il 100% delle volte. Otteniamo un tasso di successo del 70%.
Questo è chiaramente inaccettabile e dobbiamo arrivare al 100%. I thread vengono chiamati con Delegate.BeginInvoke(), che abbiamo usato con successo in altri contesti, ma a loro non piace per qualche ragione ... ovviamente non c'è EndInvoke(), perché dobbiamo rispondere immediatamente a il CGI e questa è la fine del WebMethod. ci
[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);
}
}
qualche ragione che questo tipo di 'fire and forget' chiamata fallirebbe se viene utilizzato in un ambiente WebMethod WebService:
Ecco una versione semplificata del WebMethod? Se è così allora c'è un'alternativa?
Sfortunatamente l'alterazione del lato Delphi non è un'opzione per noi - la soluzione deve essere sul lato C#.
Qualsiasi aiuto che potreste fornire sarebbe molto apprezzato.
A proposito ... nel tuo esempio come è ora, non siete mai chiamare il metodo ProcessNewBusiness nel caso "InDisasterMode". (prova a trovare il nome del metodo tra le righe da 5 a 11). –
Buon posto - Ho corretto l'esempio ora – JamesW