同MSI安装的ASP.NET Core Windows服务:一台正常一台Blazor页面JSON解析报错
问题根源
报错的核心原因是:Blazor WASM应用调用API时,报错机器返回的是text/html类型内容(而非预期的application/json),且内容以HTML标签起始符<开头,导致JSON反序列化器无法识别,抛出ExpectedStartOfValueNotFound异常。这种情况通常意味着API请求未返回正常JSON数据,而是返回了HTML格式的错误页面(比如404、500错误页)。
排查与解决步骤
1. 捕获API的实际返回内容
修改ItemService.GetItems()方法,获取API返回的原始错误内容,明确具体问题:
public async Task<List<Item>> GetItems() { var apiUrl = "api/items"; // 替换为你的实际API路由 var response = await _httpClient.GetAsync(apiUrl); // 验证响应状态,捕获错误详情 if (!response.IsSuccessStatusCode) { var errorContent = await response.Content.ReadAsStringAsync(); Console.WriteLine($"API请求失败:状态码={response.StatusCode},内容={errorContent}"); throw new InvalidOperationException($"API调用失败,返回内容:{errorContent}"); } return await response.Content.ReadFromJsonAsync<List<Item>>(); }
运行后查看浏览器控制台输出,即可判断是404(路由不存在)、500(服务器内部错误)还是其他问题。
2. 检查Windows服务状态与配置
- 确认报错机器上的Windows服务已正常启动,右键服务→属性,检查运行身份是否拥有访问数据库、监听端口的足够权限。
- 对比两台机器的
appsettings.json配置,重点验证数据库连接字符串是否正确,确保报错机器能正常连接数据库。 - 检查服务监听端口是否被占用:打开命令提示符,执行
netstat -ano | findstr :[你的服务端口],确认端口未被其他程序占用。
3. 直接访问API端点验证
在报错机器上,用浏览器或Postman直接访问API地址(比如http://localhost:[端口]/api/items):
- 若返回404错误:检查服务器端API控制器路由是否正确,确认
Program.cs中是否调用了app.MapControllers()映射API端点。 - 若返回500错误:打开Windows事件查看器→Windows日志→应用程序日志,查找服务抛出的异常信息,通常是数据库连接失败、依赖项初始化错误等原因。
4. 验证MSI安装后的环境一致性
- 确认两台机器安装的ASP.NET Core Runtime版本一致,报错机器可能缺少对应版本的运行时。
- 检查MSI安装后的文件完整性,特别是服务器端程序集、配置文件是否和正常机器一致。
5. 启用详细日志排查
在服务器端Program.cs中添加文件日志,记录服务启动和请求处理的详细信息:
using Serilog; var builder = WebApplication.CreateBuilder(args); // 配置文件日志 Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() .WriteTo.File("logs/service-log-.txt", rollingInterval: RollingInterval.Day) .CreateLogger(); builder.Logging.AddSerilog(); // 其他配置代码...
需先安装NuGet包:Serilog.AspNetCore和Serilog.Sinks.File,之后查看日志文件即可定位服务启动或请求处理中的具体错误。
内容的提问来源于stack exchange,提问作者Sarahrb
相关产品推荐
相关产品推荐

