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?

Était-ce utile?

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();
            }
        }

Vous aurez besoin d'une iAsyncresulture pour travailler avec cette approche, mais c'est un modèle établi que vous n'auriez pas dû avoir du mal à courir des échantillons.

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

http://msdn.microsoft.com/en-us/magazine/CC163725.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top