Contourner l'erreur .net core 3 "Synchronous operations are disallowed..."
Avez ASP .net core 3 vous êtes peut être déjà tombé sur l'erreur suivante :
Synchronous operations are disallowed. Call WriteAsync or set AllowSynchronousIO to true instead.
Celle-ci se produit quand vous souhaitez interagir de avec la Request ou la Response, sans utiliser de méthodes asynchrones. L'exception levée est parfaitement légitime et reflète une volonté forte de l'équipe ASP .net core de réduire les problèmes de performance et de libération des ressources (je reviendrai dessus dans un prochain article).
Il n'est pas conseillé de passer outre ce changement. Cependant, vous pouvez souhaitez utiliser .net core 3 et ses nouveauté à court terme sans changer trop en profondeur le code de vos sites. Vous pouvez donc temporairement contourner la configuration à défaut.
Méfiez-vous du "temporaire qui dure".
Pour contourner le problème. Dans un premier temps, il faut modifier le comportement de Kestrel via la méthode ConfigureKestrel
du builder. Cela se passe dans le fichier Program.cs de votre application.
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureKestrel(options =>
{
options.AllowSynchronousIO = true;
});
}
Si vous utilisez l'intégration à IIS, il faudra utiliser la méthode Configure<IISServerOptions>
de IServiceCollection
.
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<IISServerOptions>(options =>
{
options.AllowSynchronousIO = true;
});
}
}
Cela se passe dans le fichier Program.cs de votre application.
Quand votre code n'utilisera plus que du code asynchrone pour manipuler la Request ou la Response, vous pourrez supprimer ces options.