Comment définir IHttpAsyncHandler un délai d'attente?
-
13-12-2019 - |
Question
J'ai essayé de définir le executionTimeout dans le web.fichier de configuration:
<compilation debug="false" targetFramework="4.5">
<httpRuntime executionTimeout="30"/>
En regardant le Gestionnaire des services IIS Demandes de page, je peux voir les demandes ne sont pas résilié au bout de 30 secondes.
Dois-je mettre en œuvre une Minuterie à l'intérieur de mon IHttpAsyncHandler?
La solution
Avec l'absence apparente de support intégré pour les délais d'attente IHTTPASYNCHANDLANDLANDLAND, vous devez probablement gérer votre propre délai d'attente. C'est peut-être ceci par conception; Après tout, vous choisissez un motif asynchrone - qui signifie MSFT pense qu'ils essaient de définir un délai d'attente par défaut pour votre longue tâche?
Ce que je ferais est d'utiliser threadpool.registerwaitAssingleObject < / a> Pour gérer votre interrogation avec un délai d'expiration approprié. Voici un échantillon de code que j'utilise pour éviter d'attendre sur un service Web qui ne retourne jamais:
private const int REQUEST_TIMEOUT = 30000; // miliseconds (30 sec)
private void CallService()
{
try {
string url = "somewebservice.com";
WebRequest request = WebRequest.Create(url);
// Asynchronously fire off the request
IAsyncResult result = request.BeginGetResponse(new AsyncCallback(MyRoutineThatUsesTheResults), request);
// Handle timed-out requests
ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, new WaitOrTimerCallback(RequestTimeout), request, REQUEST_TIMEOUT, true);
}
catch (Exception ex) {
_logger.Error("Error during web service request.", ex);
}
private void RequestTimeout(object state, bool timedOut)
{
if (timedOut) {
WebRequest request = (WebRequest)state;
_logger.WarnFormat("Request to {0} timed out (> {1} sec)", request.RequestUri.ToString(), REQUEST_TIMEOUT / 1000);
request.Abort();
}
}
En outre, vous rencontrerez des problèmes lorsque IIS décide de recycler votre piscine d'app / déchire votre domaine d'application pendant que votre sondage est toujours en marche. Si c'est une condition que vous souhaitez gérer, vous pouvez utiliser hostingenvironment.registerObject .
Autres conseils
Vous pouvez essayer de l'ajouter à votre web.config
fichier:
<system.web>
<pages asyncTimeout="30" />
</system.web>
Son pour PageAsyncTask
, mais peut-être honorés pour IHttpAsyncHandler
trop?
Si non, vous pouvez avoir plus de chance avec le nouveau HttpTaskAsyncHandler
dans ASP.Net
Version 4.5:http://www.asp.net/vnext/overview/whitepapers/whats-new#_Toc318097378
Vous devriez utiliser registrerasyncccCaster vérifier le lien ci-dessous