Xử lý sự cố và gỡ lỗi dự án ASP.NET Core
Bởi Rick Anderson
Các liên kết sau cung cấp hướng dẫn xử lý sự cố:
- Xử lý sự cố ASP.NET Core trên Azure App Service và IIS
- Xử lý lỗi thường gặp cho Azure App Service và IIS với ASP.NET Core
- Hội nghị NDC (London, 2018): Chẩn đoán sự cố trong ứng dụng ASP.NET Core
- Blog ASP.NET: Xử lý sự cố hiệu suất ASP.NET Core
Cảnh báo từ .NET Core SDK
Cả hai phiên bản 32-bit và 64-bit của .NET Core SDK đều được cài đặt
Trong hộp thoại New Project (Dự án mới) cho ASP.NET Core, bạn có thể thấy cảnh báo sau:
Cả hai phiên bản 32-bit và 64-bit của .NET Core SDK đều được cài đặt. Chỉ các template từ phiên bản 64-bit được cài đặt tại 'C:\Program Files\dotnet\sdk\' mới được hiển thị.
Cảnh báo này xuất hiện khi cả phiên bản 32-bit (x86) và 64-bit (x64) của .NET Core SDK đều được cài đặt. Các lý do phổ biến khiến cả hai phiên bản được cài đặt bao gồm:
- Bạn đã tải xuống trình cài đặt .NET Core SDK bằng máy 32-bit nhưng sau đó đã sao chép và cài đặt trên máy 64-bit.
- .NET Core SDK 32-bit được cài đặt bởi ứng dụng khác.
- Phiên bản sai đã được tải xuống và cài đặt.
Gỡ cài đặt .NET Core SDK 32-bit để ngăn cảnh báo này. Gỡ cài đặt từ Control Panel (Bảng điều khiển) > Programs and Features (Chương trình và tính năng) > Uninstall or change a program (Gỡ cài đặt hoặc thay đổi chương trình). Nếu bạn hiểu lý do cảnh báo xuất hiện và các hàm ý của nó, bạn có thể bỏ qua cảnh báo.
.NET Core SDK được cài đặt ở nhiều vị trí
Trong hộp thoại New Project cho ASP.NET Core, bạn có thể thấy cảnh báo sau:
.NET Core SDK được cài đặt ở nhiều vị trí. Chỉ các template từ SDK được cài đặt tại 'C:\Program Files\dotnet\sdk\' mới được hiển thị.
Bạn thấy thông báo này khi có ít nhất một bản cài đặt .NET Core SDK trong thư mục ngoài C:\Program Files\dotnet\sdk\. Thường điều này xảy ra khi .NET Core SDK đã được triển khai trên máy bằng cách sao chép/dán thay vì trình cài đặt MSI.
Gỡ cài đặt tất cả .NET Core SDK và runtime 32-bit để ngăn cảnh báo này. Gỡ cài đặt từ Control Panel > Programs and Features > Uninstall or change a program. Nếu bạn hiểu lý do cảnh báo và hàm ý của nó, bạn có thể bỏ qua cảnh báo.
Không tìm thấy .NET Core SDK nào
- Trong hộp thoại New Project của Visual Studio cho ASP.NET Core, bạn có thể thấy cảnh báo sau:
Không tìm thấy .NET Core SDK nào, hãy đảm bảo chúng được bao gồm trong biến môi trường PATH.
- Khi thực thi lệnh
dotnet, cảnh báo xuất hiện dưới dạng:
Không thể tìm thấy bất kỳ dotnet SDK nào đã cài đặt.
Các cảnh báo này xuất hiện khi biến môi trường PATH không trỏ đến bất kỳ .NET Core SDK nào trên máy. Để giải quyết vấn đề này:
- Cài đặt .NET Core SDK. Tải xuống trình cài đặt mới nhất từ .NET Downloads.
- Xác minh rằng biến môi trường
PATHtrỏ đến vị trí SDK được cài đặt (C:\Program Files\dotnet\cho 64-bit/x64 hoặcC:\Program Files (x86)\dotnet\cho 32-bit/x86). Trình cài đặt SDK thường tự đặtPATH. Luôn cài đặt SDK và runtime có cùng bitness trên cùng máy.
Thiếu SDK sau khi cài đặt .NET Core Hosting Bundle
Cài đặt .NET Core Hosting Bundle (gói lưu trữ) sẽ sửa đổi PATH khi nó cài đặt .NET Core runtime để trỏ đến phiên bản 32-bit (x86) của .NET Core (C:\Program Files (x86)\dotnet\). Điều này có thể dẫn đến thiếu SDK khi lệnh dotnet 32-bit (x86) của .NET Core được sử dụng (Không tìm thấy .NET Core SDK nào). Để giải quyết vấn đề này, hãy di chuyển C:\Program Files\dotnet\ lên trước C:\Program Files (x86)\dotnet\ trong PATH.
Lấy dữ liệu từ ứng dụng
Nếu ứng dụng có khả năng phản hồi các yêu cầu, bạn có thể lấy dữ liệu sau từ ứng dụng bằng middleware (phần mềm trung gian):
- Request (yêu cầu): Method, scheme, host, pathbase, path, query string, headers
- Connection (kết nối): Remote IP address, remote port, local IP address, local port, client certificate
- Identity (danh tính): Name, display name
- Configuration settings (cài đặt cấu hình)
- Environment variables (biến môi trường)
Đặt đoạn code middleware sau vào đầu pipeline xử lý yêu cầu của phương thức Startup.Configure. Môi trường được kiểm tra trước khi middleware chạy để đảm bảo code chỉ được thực thi trong môi trường Development (Phát triển).
Lấy môi trường từ thuộc tính Environment của WebApplication. Ví dụ: if (app.Environment.IsDevelopment()) như trong đoạn code mẫu sau.
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.IISIntegration;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddAuthentication();
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
if (app.Environment.IsDevelopment())
{
app.Run(async (context) =>
{
var sb = new StringBuilder();
var nl = System.Environment.NewLine;
var rule = string.Concat(nl, new string('-', 40), nl);
var authSchemeProvider = app.Services.
GetRequiredService<IAuthenticationSchemeProvider>();
sb.Append($"Request{rule}");
sb.Append($"{DateTimeOffset.Now}{nl}");
sb.Append($"{context.Request.Method} {context.Request.Path}{nl}");
sb.Append($"Scheme: {context.Request.Scheme}{nl}");
sb.Append($"Host: {context.Request.Headers["Host"]}{nl}");
sb.Append($"PathBase: {context.Request.PathBase.Value}{nl}");
sb.Append($"Path: {context.Request.Path.Value}{nl}");
sb.Append($"Query: {context.Request.QueryString.Value}{nl}{nl}");
sb.Append($"Connection{rule}");
sb.Append($"RemoteIp: {context.Connection.RemoteIpAddress}{nl}");
sb.Append($"RemotePort: {context.Connection.RemotePort}{nl}");
sb.Append($"LocalIp: {context.Connection.LocalIpAddress}{nl}");
sb.Append($"LocalPort: {context.Connection.LocalPort}{nl}");
sb.Append($"ClientCert: {context.Connection.ClientCertificate}{nl}{nl}");
sb.Append($"Identity{rule}");
sb.Append($"User: {context.User.Identity.Name}{nl}");
var scheme = await authSchemeProvider
.GetSchemeAsync(IISDefaults.AuthenticationScheme);
sb.Append($"DisplayName: {scheme?.DisplayName}{nl}{nl}");
sb.Append($"Headers{rule}");
foreach (var header in context.Request.Headers)
{
sb.Append($"{header.Key}: {header.Value}{nl}");
}
sb.Append(nl);
sb.Append($"WebSockets{rule}");
if (context.Features.Get<IHttpUpgradeFeature>() != null)
{
sb.Append($"Status: Enabled{nl}{nl}");
}
else
{
sb.Append($"Status: Disabled{nl}{nl}");
}
sb.Append($"Configuration{rule}");
var config = builder.Configuration;
foreach (var pair in config.AsEnumerable())
{
sb.Append($"{pair.Key}: {pair.Value}{nl}");
}
sb.Append(nl);
sb.Append(nl);
sb.Append($"Environment Variables{rule}");
var vars = System.Environment.GetEnvironmentVariables();
foreach (var key in vars.Keys.Cast<string>().OrderBy(key => key,
StringComparer.OrdinalIgnoreCase))
{
var value = vars[key];
sb.Append($"{key}: {value}{nl}");
}
context.Response.ContentType = "text/plain";
await context.Response.WriteAsync(sb.ToString());
});
}
app.Run();Gỡ lỗi ứng dụng ASP.NET Core
Các liên kết sau cung cấp thông tin về việc gỡ lỗi ứng dụng ASP.NET Core.
- Gỡ lỗi ASP Core trên Linux
- Gỡ lỗi .NET Core trên Unix qua SSH
- Khởi động nhanh: Gỡ lỗi ASP.NET với trình gỡ lỗi Visual Studio
- Xem issue GitHub này để biết thêm thông tin gỡ lỗi.