Llamar a QueryAsync en Dapper arroja una InvalidOperationException

asp.net-web-api async-await dapper

Pregunta

Estaba probando el soporte asíncrono en Dapper y cuando ejecuté un caso de uso simple me encontré con el siguiente problema. Tengo un ApiController que solo desencadena entradas de registro usando dapper para crearlo en la base de datos. Mis conexiones db están bien. Cuando ejecuto una versión sincrónica de la utilización del método de extensión Query de dapper, todo funciona bien. Cuando uso QueryAsync junto con las construcciones async / await, obtengo una InvalidOperationException. Así es como se ve el código

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

Además, aquí está el aspecto de stacktrace:

en System.Data.SqlClient.SqlCommand.b_ 24 ( 1 result) at System.Threading.Tasks.ContinuationResultTaskFromResultTask Tarea 1 result) at System.Threading.Tasks.ContinuationResultTaskFromResultTask 2.InnerInvoke () en System.Threading.Tasks.Task.Execute () --- Fin del seguimiento de la pila de la anterior ubicación donde se lanzó la excepción --- en System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () en System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Tarea de tarea) en System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task task) en System .Runtime.CompilerServices.TaskAwaiter.ValidateEnd (Task task) en System.Runtime.CompilerServices.TaskAwaiter 1.GetResult() at Dapper.SqlMapper.<QueryAsync>d__69 1.MoveNext () en c: \ Dev \ Dapper \ Dapper NET45 \ SqlMapperAsync.cs: línea 21 --- Traza del final de la pila desde la ubicación anterior donde se lanzó la excepción --- en System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () en System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task task) en System.Runtime.CompilerServices.TaskAwaiter. HandleNonSuccessAndDebuggerNotification (Tarea de tarea) en System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (Tarea de tarea) en System.Runtime.CompilerServices.TaskAwaiter`1.GetResult () en WebApiBackgrounder.Controllers.BackgroundController.d _0.MoveNext ()

Parece estar fallando cuando dapper realiza una llamada a ExecuteReaderAsync. ¿Alguien sabe cómo abordar esto?

EDITAR

Aquí está la cadena de conexión

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

Respuesta aceptada

Según el mensaje de error, parece que la conexión no está abierta. Da la casualidad que Dapper normalmente trata de hacer esto por ti, así que no es irrazonable que no hayas llamado a Open () primero, creo que nos perdimos eso. Por ahora: llame a Open () en la conexión.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué