L'appel de QueryAsync dans Dapper lève une exception InvalidOperationException

asp.net-web-api async-await dapper

Question

J'étais en train d'essayer le support asynchrone dans dapper et lors de l'exécution d'un cas d'utilisation simple, j'ai rencontré le problème suivant. J'ai un ApiController qui déclenche simplement une entrée de journal en utilisant dapper pour le créer dans la base de données. Mes connexions à la base de données vont bien. Lorsque je lance une version synchrone de la méthode d'extension Query à partir de dapper, tout fonctionne correctement. Lorsque j'utilise QueryAsync avec les constructions async / waiting, je reçois une InvalidOperationException. Voici à quoi ressemble le code

public class BackgroundController : ApiController
{
    [HttpGet]
    public async Task<HttpResponseMessage> Run(string op)
    {
        using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Backgrounder"].ConnectionString))
        {
            const string sql =
                "Insert Into SimpleLog (message, threadid, created) Values(@message, @threadid, @created); " +
                "SELECT CAST(SCOPE_IDENTITY() as int)";
            var results = await (connection.QueryAsync<int>(sql, new { message = "new log record", threadid = "1", created = DateTime.Now }));
            var id = results.SingleOrDefault();
            Debug.WriteLine("inserted log record id: " + id);
        }
        return this.Request.CreateResponse(HttpStatusCode.OK);
    }
}

En outre, voici à quoi ressemble la stacktrace:

at System.Data.SqlClient.SqlCommand.b_24 ( 1 result) at System.Threading.Tasks.ContinuationResultTaskFromResultTask tâche 1 result) at System.Threading.Tasks.ContinuationResultTaskFromResultTask 2.InnerInvoke () at System.Threading.Tasks.Task.Execute () --- Fin de la trace de la pile précédente emplacement où l'exception a été renvoyée --- à System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () à System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (tâche de tâche) à System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (tâche de tâche) sur System .Runtime.CompilerServices.TaskAwaiter.ValidateEnd (tâche de tâche) sur System.Runtime.CompilerServices.TaskAwaiter 1.GetResult() at Dapper.SqlMapper.<QueryAsync>d__69 1.MoveNext () dans c: \ Dev \ Dapper \ Dapper NET45 \ SqlMapperAsync.cs: ligne 21 --- Fin de trace de pile à partir de l'emplacement précédent où l'exception a été levée --- à System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () à System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (tâche Task) à System.Runtime.CompilerServices.TaskAwaiter. HandleNonSuccessAndDebuggerNotification (tâche de tâche) à System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (tâche de tâche) sur System.Runtime.CompilerServices.TaskAwaiter`1.GetResult () à WebApiBackgrounder.Controllers.BackgroundController.d _0.MoveNext ()

Il semble échouer lorsque Dapper appelle ExecuteReaderAsync. Est-ce que quelqu'un comment y remédier?

MODIFIER

Voici la chaîne de connexion

 <add name="Backgrounder" providerName="System.Data.SqlClient" connectionString="Data Source=LPW7X6530;Initial Catalog=Sandbox;Integrated Security=SSPI;" />

Réponse acceptée

D'après le message d'erreur, la connexion ne semble pas ouverte. En fait, dapper essaie normalement de le faire pour vous - il n'est donc pas déraisonnable que vous n'ayez pas appelé Open () en premier - je suppose que cela nous a échappé. Pour l'instant: appelez Open () sur la connexion.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi