Tengo un problema cuando SetCommandTimeout es como si el método no funcionara correctamente.
Uso PostgreSQL como base de datos, y para EntityFramework Core estoy usando Npgsql.EntityFrameworkCore.PostgreSQL con la versión 5.0.5.1
En el código, configuro el tiempo de espera para 1s como este context.Database.SetCommandTimeout(1); y configuré un cronómetro para verificar cuánto tiempo toma, pero los milisegundos transcurridos siempre regresan alrededor de 15000ms a 16000ms. por lo que SetCommandTimeout(1) claramente no funciona.
También intenté usar context.Database.SetCommandTimeout(TimeSpan.FromSeconds(1)); tampoco funciona.
Una cosa más, solo quiero establecer el tiempo de espera para una solicitud específica. Entonces, la otra Solicitud tendrá el tiempo de espera predeterminado.
Aquí está mi código:
[Route("api/[controller]")] [ApiController] public class TestController : Controller { private readonly DatabaseContext context; public TestController(DatabaseContext context) { this.context = context; } [AllowAnonymous] [HttpGet] public async Task<IActionResult> Test() { var sw = Stopwatch.StartNew(); try { context.Database.SetCommandTimeout(1); var test = await context.Test.FirstOrDefaultAsync(); return Ok(); } catch (Exception) { return BadRequest(); } finally { sw.Stop(); var elapsed = sw.ElapsedMilliseconds; // always return around 15000ms to 16000ms } } }así es como lo registro en Startup.Cs
services.AddDbContext<DatabaseContext>(options => { options.UseNpgsql(ConnectionString); });¿Me perdí algo?
Gracias por adelantado
El tiempo de espera del comando es el tiempo que se permite ejecutar una consulta/comando en el servidor de la base de datos. El temporizador se inicia cuando el servidor de la base de datos recibe la solicitud. El tiempo de ida y vuelta de un extremo a otro puede ser mayor que el tiempo de espera del comando debido al rendimiento de la red u otras limitaciones, incluido el agotamiento de los recursos en su servidor web.
Tiempo de espera del comando: el tiempo de espera (en segundos) al intentar ejecutar un comando antes de finalizar el intento y generar un error. Fuente
Busqué en Google un poco y encontré problemas relacionados con esta biblioteca.
Según esta publicación del foro , parece que el problema proviene del código fuente y la configuración simplemente se ignora.
Intente configurar el tiempo de espera del comando dentro de la creación del contexto de la base de datos justo antes del uso.
Otro está en el repositorio de github .
La solución para esto es actualizar a la última versión de los controladores .
Otro de github .
La solución para esto es modificar la cadena de conexión durante la creación del contexto :
if (!connectionString.Contains("CommandTimeout")) { connectionString += $";CommandTimeout=120"; }EDITAR (después de que OP mencionó que quiere usarlo en una sola solicitud): recomendaría seguir el camino creando otro contexto de base de datos y modificando su cadena de conexión (como se indicó anteriormente). De esa manera, podrá ejecutar comandos de ejecución corta/larga. Sin embargo, esto trae otros problemas relacionados con el contexto de base de datos múltiple y la posible falta de coincidencia de datos. Necesita ser manejado con precaución.