یک نکته: تاثیر hot reload دات نت 6 بر روی درخواستهای HTTP سمت کلاینت
ممکن است پس از ارتقاء به دات نت 6، شاهد خطاهای BadHttpRequestException زیادی در سمت Web API شوید (البته فقط در حالت توسعه):
این خطا عنوان میکند که درخواست HTTP رسیده ناقص است و در اینجا بیشتر به معنای abort شدن آن در سمت کلاینت است. عکس العمل برنامهی Blazor به یک چنین خطایی که در سمت سرور رخ داده، ریفرش کردن کل آدرس جاری و راه اندازی مجدد برنامهاست. اما ... چرا این اتفاق رخ داده بود؟
اگر برنامهی شما اطلاعاتی را در پوشهی wwwroot ثبت کند، برای مثال یک بانک اطلاعاتی SQLite را در آن قرار دادهاید، hot reload حتی این پوشه را هم تحت کنترل خود دارد و با هر تغییری در آن، حتی نوشته شدن یک رکورد در فایل بانک اطلاعاتی، مجددا برنامه را کامپایل میکند. همین کامپایل پشت صحنه، سبب abort شدن درخواستهای HTTP سمت کلاینت آن و مشاهدهی خطاهای BadHttpRequestException سمت سرور میشود که عدم اطلاع از دلیل آن میتواند این تصور را پیش بیاورد که کدهای برنامه مشکلی دارند، اما خیر.
اگر با CLI کار میکنید، دستور dotnet watch run --no-hot-reload کمی وضع را بهتر میکند و معادل افزودن تنظیم زیر به فایل Properties\launchSettings.json است:
راه حل دیگر آن، خارج کردن پوشهی wwwroot از حالت watch است که به صورت زیر در فایل csproj قابل انجام است (در سمت برنامهی web api):
ممکن است پس از ارتقاء به دات نت 6، شاهد خطاهای BadHttpRequestException زیادی در سمت Web API شوید (البته فقط در حالت توسعه):
Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Unexpected end of request content.
اگر برنامهی شما اطلاعاتی را در پوشهی wwwroot ثبت کند، برای مثال یک بانک اطلاعاتی SQLite را در آن قرار دادهاید، hot reload حتی این پوشه را هم تحت کنترل خود دارد و با هر تغییری در آن، حتی نوشته شدن یک رکورد در فایل بانک اطلاعاتی، مجددا برنامه را کامپایل میکند. همین کامپایل پشت صحنه، سبب abort شدن درخواستهای HTTP سمت کلاینت آن و مشاهدهی خطاهای BadHttpRequestException سمت سرور میشود که عدم اطلاع از دلیل آن میتواند این تصور را پیش بیاورد که کدهای برنامه مشکلی دارند، اما خیر.
اگر با CLI کار میکنید، دستور dotnet watch run --no-hot-reload کمی وضع را بهتر میکند و معادل افزودن تنظیم زیر به فایل Properties\launchSettings.json است:
"profiles": { "Name.Server": { "hotReloadEnabled": false,
<ItemGroup> <Watch Remove="wwwroot\**\*" /> </ItemGroup>