Internal Server Error? Not found!

Nedávno jsem při práci na web API pod ASP.NET Core narazil na zajímavý problém. API, které při vývoji fungovalo správně, začalo po deployi na  Azure vracet chyby HTTP 404 Not Found pro většinu endpointů. Situace byle ještě zvláštnější proto, že chyba nastávala pouze v případě validních requestů. V případě nevalidních se správně provedla validace uvnitř action metod a výsledkem byl korektně stavový kód HTTP 400 Bad Request.

Použili jsme diagnostické logování v Azure App Service což nám umožnilo rychle odhalit chybu – špatný connection string na naši SQL databázi, který způsoboval vyhození výjimek SqlException při každém pokusu o připojení. To vysvětlilo, proč se špatně chovaly validní requesty, ale nevysvětlilo, proč jsme namísto chyby 404 nedostávali správně chybu 500 (Internal Server Error). Usoudil jsem, že problém musí být skrytý někde uvnitř pipeline requestu. Proto jsem se podíval do souboru Startup.cs a jeho metody Configure . A skutečně, náš viník byl na světě!

if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
// oh!
app.UseExceptionHandler("/Error");
}

view raw
Startup.cs
hosted with ❤ by GitHub

Protože jsme založili náš projekt na šabloně ASP.NET Core MVC osahoval také unhandled exception handling ve formě UseExceptionHandler middleware. Naneštěstí pro nás nebyla jemu zadaná route (/Error) nikdy implementována, protože jsme pracovali pouze na API. Když tedy došlo k nezpracované výjimce v průběhu dotazu, vybublala až k exception handler middleware, který se ji pokusil zpracovat pomocí route /Error. Ta ale neexistovala, čímž se zrodila naše chyba 404 Not Found. Ponaučení tedy je, že je vždy třeba se ujistit, že všechny možné cesty, kterými je náš request zpracováván, jsou správně nakonfigurované.

Buy me a coffeeBuy me a coffee

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.