web-dev-qa-db-fra.com

Comment augmenter le temps dans web.config pour exécuter une requête SQL

Lorsque j'exécute une requête dans une application Web, j'obtiens une valeur null. La même requête directement dans SQL Management Studio renvoie les résultats. 

Je pense que le problème est un délai d'attente. Comment puis-je augmenter le temps d'exécution d'une requête dans une application Web? Dans mon fichier web.config: connectionstring, il n'y a pas de code pour le délai d'expiration. Si je choisis un délai d'attente, cela affectera-t-il d'autres parties de mon système? 

9
Jui Test

Vous pouvez faire une chose.

  1. Dans le fichier AppSettings.config (créez-en un s'il n'existe pas), créez une paire clé-valeur.
  2. Dans le code, extrayez la valeur, convertissez-la en Int32 et affectez-la à command.TimeOut.

comme: - Dans appsettings.config ->

<appSettings>    
   <add key="SqlCommandTimeOut" value="240"/>
</appSettings>

En code ->

command.CommandTimeout = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SqlCommandTimeOut"]);

Ça devrait le faire.

Remarque: - J'ai rencontré la plupart des problèmes de délai d'attente lorsque j'ai utilisé la classe SqlHelper à partir de blocs d'application Microsoft. Si vous l'avez dans votre code et que vous rencontrez des problèmes de dépassement de délai, mieux vaut utiliser sqlcommand et le définir comme décrit ci-dessus. Pour tous les autres scénarios, sqlhelper devrait faire l'affaire. Si votre client accepte d’attendre un peu plus longtemps que ce que propose la classe sqlhelper, vous pouvez utiliser la technique ci-dessus.

exemple: - Utilisez ceci -

 SqlCommand cmd = new SqlCommand(completequery);

 cmd.CommandTimeout =  Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SqlCommandTimeOut"]);

 SqlConnection con = new SqlConnection(sqlConnectionString);
 SqlDataAdapter adapter = new SqlDataAdapter();
 con.Open();
 adapter.SelectCommand = new SqlCommand(completequery, con);
 adapter.Fill(ds);
 con.Close();

Au lieu de 

DataSet ds = new DataSet();
ds = SqlHelper.ExecuteDataset(sqlConnectionString, CommandType.Text, completequery);

Mise à jour: Voir également la réponse @Triynko ci-dessous. Il est important de vérifier cela aussi.

11
user3328730

Vous devez ajouter le bloc httpRuntime et traiter avec executionTimeout (en secondes).

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
...
 <system.web>
   <httpRuntime executionTimeout="90" maxRequestLength="4096"
    useFullyQualifiedRedirectUrl="false"
    minFreeThreads="8"
    minLocalRequestFreeThreads="4"
    appRequestQueueLimit="100" />
 </system.web>
... 
</configuration>

Pour plus d'informations, veuillez consulter page msdn .

3
ibo.ezhe

SQL Server ne dispose d'aucun paramètre pour contrôler le délai de requête dans la chaîne de connexion et, autant que je sache, il en va de même pour les autres bases de données principales. Mais cela ne ressemble pas au problème que vous voyez: je m'attendrais à ce qu'une exception soit levée 

Erreur: System.Data.SqlClient.SqlException: le délai d'attente a expiré. Le délai d'attente écoulé avant la fin de l'opération ou le serveur ne répond pas.

s’il y avait vraiment un délai d’exécution de la requête.

Si cela pose problème, vous pouvez modifier le délai d'attente par défaut pour une base de données SQL Server en tant que propriété de la base de données elle-même. utilisez SQL Server Manager pour cela.

Assurez-vous que la requête est exactement identique à celle de votre application Web et à celle que vous exécutez directement. Utilisez un profileur pour vérifier cela.

3
Jeremy McGee

Je me rends compte que je suis un peu en retard au jeu, mais je viens de passer plus d'une journée à essayer de changer le délai d'attente d'un service web. Il semblait avoir un délai d’expiration par défaut de 30 secondes. Après avoir changé toutes les valeurs de délai d'attente que je pouvais trouver, notamment:

  • Chaîne de connexion à la base de données
  • httpRuntime executionTimeout
  • reliure basicHttpBinding closeTimeout
  • liaison de base basicHttpBinding
  • liaison basicHttpBinding receiveTimeout
  • liaison basicHttpBinding openTimeout

Finaley j'ai trouvé que c'était le délai d'attente SqlCommand qui était par défaut à 30 secondes.

J'ai décidé de simplement dupliquer le délai d'attente de la chaîne de connexion à la commande. La chaîne de connexion est configurée dans le fichier web.config.

Un code:

namespace ROS.WebService.Common
{
  using System;
  using System.Configuration;
  using System.Data;
  using System.Data.SqlClient;

  public static class DataAccess
  {
    public static string ConnectionString { get; private set; }

    static DataAccess()
    {
      ConnectionString = ConfigurationManager.ConnectionStrings["ROSdb"].ConnectionString;
    }

    public static int ExecuteNonQuery(string cmdText, CommandType cmdType, params SqlParameter[] sqlParams)
    {
      using (SqlConnection conn = new SqlConnection(DataAccess.ConnectionString))
      {
        using (SqlCommand cmd = new SqlCommand(cmdText, conn) { CommandType = cmdType, CommandTimeout = conn.ConnectionTimeout })
        {
          foreach (var p in sqlParams) cmd.Parameters.Add(p);
          cmd.Connection.Open();
          return cmd.ExecuteNonQuery();
        }
      }
    }
  }
}

Modification introduite en "dupliquer" la valeur de délai d'attente à partir de la chaîne de connexion: CommandTimeout = conn.ConnectionTimeout

1
kesse

Je pense que vous ne pouvez pas augmenter le temps d'exécution de la requête, mais vous devez augmenter le délai d'attente de la requête.

Délai d'exécution de l'exécution Spécifie le nombre maximal de secondes pendant lequel une demande est autorisée à s'exécuter avant d'être fermée automatiquement par ASP.NET. (Le temps par défaut est de 110 secondes.)

Pour plus de détails, consultez https://msdn.Microsoft.com/en-us/library/e1f13641%28v=vs.100%29.aspx

Vous pouvez le faire dans le web.config. par exemple

<httpRuntime maxRequestLength="2097152" executionTimeout="600" />
1
Muhammad Akhtar