Xử lý sự cố ASP.NET Core trên Azure App Service và IIS
Đây là hướng dẫn xử lý sự cố toàn diện để chẩn đoán và giải quyết các vấn đề khi triển khai ứng dụng ASP.NET Core lên Azure App Service hoặc IIS (Internet Information Services - Dịch vụ thông tin Internet).
Tổng quan
Hướng dẫn này bao gồm:
- Lỗi khởi động ứng dụng - Các kịch bản mã trạng thái HTTP phổ biến
- Xử lý sự cố Azure App Service - Chiến lược chẩn đoán và ghi nhật ký
- Xử lý sự cố IIS - Kỹ thuật gỡ lỗi tại chỗ và cục bộ
- Vấn đề bộ nhớ đệm gói - Giải pháp cho các gói không nhất quán sau khi nâng cấp
- Tài nguyên bổ sung - Liên kết đến các chủ đề xử lý sự cố liên quan
Lỗi khởi động ứng dụng
403.14 Forbidden (Bị cấm)
Lỗi: "The Web server is configured to not list the contents of this directory." (Máy chủ Web được cấu hình để không liệt kê nội dung của thư mục này.)
Nguyên nhân:
- Ứng dụng được triển khai vào thư mục sai
- Quá trình triển khai không di chuyển được tất cả các tệp
- Tệp
web.configthiếu hoặc bị lỗi định dạng
Giải pháp:
- Xóa tất cả tệp/thư mục khỏi thư mục triển khai
- Triển khai lại nội dung từ thư mục
publishcủa ứng dụng - Xác minh
web.configcó mặt và đúng - Azure App Service: xác nhận triển khai đến
D:\home\site\wwwroot - IIS: xác nhận triển khai đến đường dẫn vật lý IIS được hiển thị trong IIS Manager
- So sánh các tệp đã triển khai với nội dung thư mục
publish
500 Internal Server Error (Lỗi máy chủ nội bộ)
Lỗi: Ứng dụng khởi động nhưng không thể xử lý yêu cầu
Nguyên nhân:
- Lỗi trong code ứng dụng khi khởi động hoặc tạo phản hồi
- .NET Hosting Bundle (gói lưu trữ) không được cài đặt hoặc bị hỏng
Giải pháp:
- Chạy ứng dụng tại command prompt (dấu nhắc lệnh) trên máy chủ hoặc bật log stdout (nhật ký đầu ra chuẩn) của ASP.NET Core Module
- Cài đặt hoặc sửa chữa .NET Hosting Bundle
500.0 In-Process Handler Load Failure (Lỗi tải handler trong tiến trình)
Lỗi: Worker process (tiến trình làm việc) thất bại; ứng dụng không khởi động
Giải pháp:
- Liên hệ hỗ trợ Microsoft
- Đặt câu hỏi trên Stack Overflow
- Nộp issue trên GitHub
500.30 In-Process Startup Failure (Lỗi khởi động trong tiến trình)
Nguyên nhân: ASP.NET Core Module (mô-đun ASP.NET Core) không khởi động được .NET CLR trong tiến trình
Điều kiện lỗi phổ biến:
- Ứng dụng nhắm mục tiêu phiên bản shared framework (framework dùng chung) của ASP.NET Core không có trên máy
- Vấn đề quyền truy cập Azure Key Vault
Giải pháp:
- Kiểm tra các phiên bản shared framework ASP.NET Core đã cài đặt
- Xác minh chính sách truy cập Key Vault
500.31 ANCM Failed to Find Native Dependencies (Không tìm thấy phụ thuộc gốc)
Lỗi: Không tìm thấy runtime Microsoft.NETCore.App hoặc Microsoft.AspNetCore.App
Ví dụ lỗi:
The specified framework 'Microsoft.NETCore.App', version '3.0.0' was not found.
- The following frameworks were found:
2.2.1 at [C:\Program Files\dotnet\x64\shared\Microsoft.NETCore.App]
3.0.0-preview5-27626-15 at [...]Giải pháp:
- Cài đặt phiên bản .NET phù hợp
- Thay đổi ứng dụng để nhắm mục tiêu phiên bản .NET đã cài đặt
- Xuất bản dưới dạng self-contained deployment (triển khai độc lập)
500.32 ANCM Failed to Load dll (Không tải được dll)
Nguyên nhân: Ứng dụng được xuất bản cho kiến trúc processor (bộ xử lý) không tương thích (không khớp 32-bit và 64-bit)
Giải pháp:
- Xuất bản lại cho cùng kiến trúc processor với worker process
- Xuất bản dưới dạng framework-dependent deployment (triển khai phụ thuộc framework)
500.33 ANCM Request Handler Load Failure (Lỗi tải request handler)
Nguyên nhân: Ứng dụng không tham chiếu đến framework Microsoft.AspNetCore.App
Giải pháp:
- Xác minh ứng dụng nhắm mục tiêu framework
Microsoft.AspNetCore.App - Kiểm tra tệp
.runtimeconfig.json
500.34 ANCM Mixed Hosting Models Not Supported (Mô hình lưu trữ hỗn hợp không được hỗ trợ)
Nguyên nhân: Worker process không thể chạy cả ứng dụng in-process và out-of-process
Giải pháp:
- Chạy ứng dụng trong các application pool IIS riêng biệt
500.35 ANCM Multiple In-Process Applications in same Process (Nhiều ứng dụng trong tiến trình)
Nguyên nhân: Worker process không thể chạy nhiều ứng dụng in-process
Giải pháp:
- Chạy ứng dụng trong các application pool IIS riêng biệt
500.36 ANCM Out-Of-Process Handler Load Failure (Lỗi tải handler ngoài tiến trình)
Nguyên nhân: aspnetcorev2_outofprocess.dll bị hỏng hoặc thiếu
Giải pháp:
- Sửa chữa cài đặt .NET Hosting Bundle
500.37 ANCM Failed to Start Within Startup Time Limit (Vượt quá thời gian khởi động)
Nguyên nhân: ANCM vượt quá thời gian khởi động mặc định 120 giây
Giải pháp:
- Kiểm tra việc sử dụng CPU/bộ nhớ đột biến khi khởi động
- Phân tán thời gian khởi động của nhiều ứng dụng
500.38 ANCM Application DLL Not Found (Không tìm thấy DLL ứng dụng)
Nguyên nhân: ANCM không thể định vị DLL ứng dụng (vấn đề tệp thực thi đơn)
Giải pháp:
- Vô hiệu hóa xuất bản single-file: đặt
PublishSingleFilethànhfalse - HOẶC chuyển sang out-of-process hosting: đặt
AspNetCoreHostingModelthànhOutOfProcess
502.5 Process Failure (Lỗi tiến trình)
Nguyên nhân: ASP.NET Core Module không khởi động được worker process
Điều kiện phổ biến: Ứng dụng nhắm mục tiêu phiên bản shared framework ASP.NET Core bị thiếu
Giải pháp:
- Kiểm tra các phiên bản shared framework ASP.NET Core đã cài đặt
- Xác minh phiên bản tham chiếu metapackage khớp với framework đã cài đặt
Lỗi khởi động ứng dụng (ErrorCode '0x800700c1')
Nguyên nhân: Không khớp bitness giữa ứng dụng đã xuất bản và tiến trình w3wp/iisexpress
Giải pháp:
- Chọn app pool trong IIS Manager
- Chọn Advanced Settings (Cài đặt nâng cao)
- Đặt Enable 32-Bit Applications (Bật ứng dụng 32-Bit):
Truecho ứng dụng 32-bit (x86)Falsecho ứng dụng 64-bit (x64)- Xác minh không có xung đột với thuộc tính MSBuild
<Platform>
Lỗi khởi động ứng dụng (ErrorCode '0x800701b1')
Nguyên nhân: Windows Service không tải được
Ví dụ sửa lỗi: Bật null Windows Service:
sc.exe start null
Connection reset (Đặt lại kết nối)
Nguyên nhân: Lỗi xảy ra sau khi gửi headers (quá muộn để trả về lỗi 500)
Tình huống phổ biến: Lỗi trong quá trình serialization (tuần tự hóa) các đối tượng phản hồi phức tạp
Giải pháp:
- Sử dụng application logging (ghi nhật ký ứng dụng) để xử lý sự cố
Giới hạn khởi động mặc định
Mặc định: ASP.NET Core Module có startupTimeLimit là 120 giây
Vấn đề: Ứng dụng có thể mất 2 phút để khởi động trước khi ghi nhật ký lỗi
Giải pháp:
- Cấu hình cài đặt khởi động module trong
web.config
Xử lý sự cố trên Azure App Service
Lưu ý quan trọng: Phiên bản Preview của ASP.NET Core
Các phiên bản preview của ASP.NET Core không được triển khai lên Azure App Service theo mặc định. Để triển khai phiên bản preview, xem Triển khai phiên bản preview ASP.NET Core lên Azure App Service.
Log Stream của Azure App Services
Các bước:
- Mở ứng dụng trong App Services
- Điều hướng đến Monitoring > App Service Logs
- Chọn File System cho Web Server Logging
- Tùy chọn bật Application logging
- Điều hướng đến Monitoring > Log stream
- Chọn Application logs hoặc Web Server Logs
Lưu ý: Streaming logs có độ trễ và có thể không hiển thị ngay lập tức
Application Event Log (Nhật ký sự kiện ứng dụng) trên Azure App Service
Sử dụng blade Diagnose and solve problems:
- Mở ứng dụng trong App Services
- Chọn Diagnose and solve problems (Chẩn đoán và giải quyết vấn đề)
- Chọn tiêu đề Diagnostic Tools (Công cụ chẩn đoán)
- Dưới Support Tools, chọn nút Application Events
- Kiểm tra lỗi mới nhất từ IIS AspNetCoreModule hoặc IIS AspNetCoreModule V2
Sử dụng Kudu (phương pháp thay thế):
- Mở Advanced Tools trong khu vực Development Tools, chọn Go→
- Mở Debug console và chọn CMD
- Mở thư mục LogFiles
- Chọn biểu tượng bút chì bên cạnh
eventlog.xml - Kiểm tra log (cuộn xuống dưới để xem sự kiện gần đây)
Chạy ứng dụng trong Kudu console
Nhiều lỗi khởi động không tạo ra thông tin hữu ích trong Application Event Log.
Các bước:
- Mở Advanced Tools trong Development Tools, chọn Go→
- Mở Debug console và chọn CMD
Test ứng dụng 32-bit (x86) - Phiên bản hiện tại
cd d:\home\site\wwwroot
Framework-dependent deployment:
dotnet .\{TÊN ASSEMBLY}.dllSelf-contained deployment:
{TÊN ASSEMBLY}.exeTest ứng dụng 64-bit (x64) - Phiên bản hiện tại
Framework-dependent deployment:
cd D:\Program Files\dotnet
dotnet \home\site\wwwroot\{TÊN ASSEMBLY}.dllSelf-contained deployment:
cd D:\home\site\wwwroot
{TÊN ASSEMBLY}.exeLog stdout của ASP.NET Core Module trên Azure App Service
Cảnh báo: Tắt log stdout khi hoàn thành để ngăn lỗi ứng dụng/máy chủ. Không có giới hạn kích thước log. Chỉ sử dụng để xử lý sự cố khởi động.
Các bước:
- Trong Azure portal, điều hướng đến web app
- Nhập "kudu" vào hộp tìm kiếm
- Chọn Advanced Tools > Go
- Chọn Debug console > CMD
- Điều hướng đến
site/wwwroot - Chỉnh sửa tệp
web.config - Trong phần tử
<aspNetCore />, đặtstdoutLogEnabled="true" - Chọn Save
Tắt khi hoàn thành:
<aspNetCore> stdoutLogEnabled="false" </aspNetCore>
Log debug của ASP.NET Core Module trên Azure App Service
Hai phương pháp để bật:
Phương pháp 1: Cấu hình trước khi triển khai
- Làm theo Enhanced diagnostic logs
- Triển khai lại ứng dụng
Phương pháp 2: Chỉnh sửa ứng dụng trực tiếp qua Kudu
- Mở Advanced Tools > Go
- Mở Debug console > CMD
- Điều hướng đến site > wwwroot
- Chỉnh sửa
web.config - Thêm phần
<handlerSettings>theo Enhanced diagnostic logs - Chọn Save
Cảnh báo: Tắt khi hoàn thành để ngăn lỗi. Không có giới hạn kích thước log.
Xử lý sự cố trên IIS
Application Event Log (IIS)
Các bước:
- Mở menu Start, tìm kiếm Event Viewer (Trình xem sự kiện)
- Mở nút Windows Logs
- Chọn Application
- Tìm kiếm lỗi với IIS AspNetCore Module hoặc IIS Express AspNetCore Module trong cột Source (Nguồn)
Chạy ứng dụng tại command prompt
Framework-dependent deployment:
dotnet .\<tên_assembly>.dll
Self-contained deployment:
<tên_assembly>.exe
Kiểm tra đầu ra console để phát hiện lỗi. Test endpoint Kestrel tại http://localhost:5000/
Log stdout của ASP.NET Core Module (IIS)
Cảnh báo: Tắt khi hoàn thành. Không có giới hạn kích thước log. Không tắt có thể gây lỗi ứng dụng/máy chủ.
Các bước:
- Điều hướng đến thư mục triển khai
- Tạo thư mục
logsnếu chưa có - Chỉnh sửa
web.config:
``xml <aspNetCore> stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" </aspNetCore> ``
stdoutlà tiền tố tên tệp; timestamp, process ID và phần mở rộng được thêm tự động- Ví dụ:
stdout_20180205184032_5412.log - Đảm bảo app pool identity có quyền ghi vào thư mục
logs - Lưu
web.config - Thực hiện yêu cầu đến ứng dụng
- Xem lại log trong thư mục
logs
Tắt:
- Chỉnh sửa
web.config - Đặt
stdoutLogEnabled="false" - Lưu
Log debug của ASP.NET Core Module (IIS)
Thêm cài đặt handler vào web.config:
<aspNetCore ...>
<handlerSettings>
<handlerSetting name="debugLevel" value="file" />
<handlerSetting name="debugFile" value="c:\temp\ancm.log" />
</handlerSettings>
</aspNetCore>Yêu cầu:
- Đường dẫn log được chỉ định phải tồn tại
- App pool identity phải có quyền ghi
Bật Developer Exception Page (Trang ngoại lệ nhà phát triển)
Đặt ASPNETCORE_ENVIRONMENT trong web.config:
<aspNetCore processPath="dotnet"
arguments=".\MyApp.dll"
stdoutLogEnabled="false"
stdoutLogFile=".\logs\stdout"
hostingModel="InProcess">
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
</aspNetCore>Quan trọng: Chỉ dùng cho máy chủ staging/testing KHÔNG được tiếp xúc với Internet. Xóa sau khi xử lý sự cố.
Ứng dụng chậm hoặc không phản hồi (IIS)
Crash dump - Ảnh chụp bộ nhớ hệ thống để chẩn đoán crashes, lỗi khởi động hoặc ứng dụng chậm
Ứng dụng bị crash hoặc gặp ngoại lệ
Sử dụng Windows Error Reporting (WER):
- Tạo thư mục
c:\dumps(app pool cần quyền ghi) - Chạy script PowerShell EnableDumps
In-process hosting: ``powershell .\EnableDumps w3wp.exe c:\dumps ``
Out-of-process hosting: ``powershell .\EnableDumps dotnet.exe c:\dumps ``
- Chạy ứng dụng trong điều kiện gây crash
- Chạy script PowerShell DisableDumps
In-process: ``powershell .\DisableDumps w3wp.exe ``
Out-of-process: ``powershell .\DisableDumps dotnet.exe ``
Script thu thập tối đa 5 dump mỗi ứng dụng.
Cảnh báo: Crash dump có thể rất lớn (lên đến vài GB mỗi tệp)
Xóa bộ nhớ đệm gói
Ứng dụng có thể thất bại ngay sau khi nâng cấp SDK hoặc thay đổi phiên bản gói do các gói không nhất quán.
Các bước giải quyết:
- Xóa thư mục
binvàobj - Xóa bộ nhớ đệm gói:
``bash dotnet nuget locals all --clear ``
HOẶC với nuget.exe: ``bash nuget locals all -clear ``
- Khôi phục và xây dựng lại dự án
- Xóa tất cả tệp trong thư mục triển khai máy chủ trước khi triển khai lại