Erreur de délai d’expiration de la demande lorsque vous utilisez la méthode DataAdapter dans une application ASP.NET

Cet article vous aide à résoudre le problème où une erreur (Délai d’expiration de la demande) se produit dans une application web ASP.NET.

              Version d’origine du produit : ASP.NET
Numéro de la base de connaissances d’origine : 825739

Symptômes

Lorsque vous utilisez la DataAdapter.Fill méthode ou que vous exécutez une requête dans une application web ASP.NET dont le traitement prend plus de 90 secondes, vous pouvez recevoir le message d’erreur suivant :

HttpException (0x80004005) : la demande a expiré.

Cette erreur se produit uniquement lorsque vous exécutez l’application Web en mode release et que la valeur de l’attribut Debug dans le fichier web.config est définie sur false.

Cause

Par défaut, la valeur de l’attribut executionTimeout est définie sur 90 secondes dans le fichier Machine.config . Cette erreur se produit lorsque le temps de traitement dépasse 90 secondes.

Solution de contournement

Pour contourner ce problème, augmentez la valeur de délai d’attente définie pour l’attribut executionTimeout dans le fichier de configuration.

L’attribut executionTimeout existe sous <httpRequest> dans le fichier Machine.config . Vous pouvez modifier ces paramètres dans le fichier web.config ou dans le fichier Machine.config . La valeur par défaut du délai d’attente est de 90 secondes. L’attribut executionTimeout indique le nombre maximal de secondes pendant lesquelles une requête est autorisée à s’exécuter avant d’être arrêtée par l’application web ASP.NET.

Méthode 1 : Définir la valeur de l’attribut ExecutionTimeout dans le fichier Web.config

  1. Ouvrez le fichier web.config dans le Bloc-notes.

  2. Ajoutez l’élément <httpRuntime> dans la <system.web> section comme suit :

    <configuration>
        <system.web>
            <httpRuntime executionTimeout="90" maxRequestLength="4096" useFullyQualifiedRedirectUrl="false"
            minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="100" />
        </system.web>
    </configuration>
    
  3. Modifiez la valeur de l’attribut executionTimeout pour éviter les erreurs de délai d’attente.

  4. Enregistrez le fichier web.config .

Méthode 2 : Définir la valeur de l’attribut ExecutionTimeout dans le fichier Machine.config

  1. Ouvrez le fichier Machine.config dans le Bloc-notes. Le fichier Machine.config se trouve dans le %SystemRoot%\Microsoft.NET\Framework\%VersionNumber%\CONFIG\ répertoire .

  2. Dans le fichier Machine.config , recherchez l’élément <httpRuntime> . Le fichier web.config se trouve dans le répertoire de l’application web.

    <httpRuntime executionTimeout="90" maxRequestLength="4096" useFullyQualifiedRedirectUrl="false"
    minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="100" />
    
  3. Modifiez la valeur de l’attribut executionTimeout pour éviter les erreurs de délai d’attente.

  4. Enregistrez le fichier Machine.config .

Statut

Ce comportement est inhérent au produit.

Procédures pour reproduire le problème

  1. Démarrez Microsoft Visual Studio .NET.

  2. Dans le menu Fichier, pointez sur Nouveau, puis sélectionnez Projet.

  3. Sélectionnez Projets Visual Basic sous Types de projets, puis ASP.NET application web sous Modèles. Par défaut, WebForm1.aspx est créé.

  4. En mode Création, cliquez avec le bouton droit sur WebForm1, puis sélectionnez Afficher le code.

  5. Pour ajouter la connexion à la base de données et la DataAdapter méthode pour remplir le jeu de données, remplacez le code existant par le code suivant :

    Imports System.Data.SqlClient
    Public Class WebForm1
       Inherits System.Web.UI.Page
    
       Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
          Try
             Dim sConnectionString As String
             sConnectionString = "server=servername;uid=sa;pwd=password;database=testdatabase;"
             Dim objConn As SqlConnection
             objConn = New SqlConnection(sConnectionString)
             objConn.Open()
    
             Dim daAuthors As SqlDataAdapter
    
             'Increase the no.of records from existing value, if execution time is less than 90 sec.
             daAuthors = New SqlDataAdapter("Select top 60000 * From timelog (nolock)", objConn)
             Dim myDs As DataSet
             myDs = New DataSet("testTimelog")
             Dim dt As DateTime
             dt = New DateTime()
             dt = dt.Now
             Response.Write("StartTime of DataAdapter fill - " + dt)
             daAuthors.Fill(myDs, "testTimelog")
    
             dt = New DateTime()
             dt = dt.Now
             Response.Write("<br>EndTime of DataAdapter fill - " + dt)
             Response.Write("<br>No of Rows = " + myDs.Tables(0).Rows.Count.ToString())
    
          Catch ex As Exception
             Response.Write(ex.ToString())
          End Try
       End Sub
    End Class
    
  6. Ouvrez le fichier web.config dans le Bloc-notes, puis définissez la valeur de l’attribut Debug sur false comme suit :

    <configuration>
        <system.web>
            <compilation defaultLanguage="vb" debug="false" />
        </system.web>
    </configuration>
    
  7. Définissez l’application pour qu’elle génère en mode mise en production. Pour cela, procédez comme suit :

    1. Dans Explorateur de solutions, cliquez avec le bouton droit sur votre projet.
    2. Sélectionnez Propriétés, puis Configuration Manager.
    3. Sélectionnez Mise en production sous Configuration de la solution active, puis sélectionnez Fermer.
    4. Sélectionnez OK.
  8. Dans le menu Déboguer , sélectionnez Démarrer pour générer et exécuter le projet. Vous pouvez recevoir le message d’erreur décrit dans la section Symptômes .

Remarque

La valeur par défaut du délai d’attente défini dans le fichier Machine.config est de 90 secondes. Si le temps de traitement est inférieur à 90 secondes, augmentez le temps de traitement en augmentant le nombre d’enregistrements à extraire.

References