Blazor项目调用PostgreSQL遇System.Net.NameResolution平台不支持错误
问题解决:Blazor WASM中调用Domain层数据库服务抛出PlatformNotSupportedException
错误原因
Blazor WebAssembly运行在浏览器沙箱环境中,不支持直接进行DNS解析(System.Net.NameResolution),同时浏览器安全策略禁止前端直接连接数据库。你当前的架构中,Blazor Dashboard直接引用Domain层服务,该服务通过EF Core + Npgsql直接连接PostgreSQL,完全违反WASM运行限制,因此触发此错误。
解决步骤
- 调整架构,通过现有Api层中转数据库操作
放弃在WASM项目中直接调用Domain层的数据库服务,改为让Dashboard通过HTTP请求调用Api层接口,由Api层负责调用Domain和Infrastructure层处理数据库逻辑——这是Blazor WASM应用的标准架构模式。 - 移除Dashboard项目对Domain、Infrastructure层的直接引用
这些层包含的数据库驱动、EF Core依赖不支持WASM运行时,移除引用可避免不必要的编译和运行时问题。
代码示例
- Api层新增接口控制器
[ApiController] [Route("api/auction-events")] public class AuctionEventsController : ControllerBase { private readonly AuctionEventDataService _dataService; public AuctionEventsController(AuctionEventDataService dataService) { _dataService = dataService; } [HttpGet] public async Task<IActionResult> GetEvents( [FromQuery] int pageCount, [FromQuery] int page, [FromQuery] string provider, [FromQuery] string city) { var eventDtos = await _dataService.GetEventDtosByName(pageCount, page, provider, city); return Ok(eventDtos); } }
- 修改Dashboard的EventService
将直接调用Domain服务改为通过HttpClient调用Api接口:
public class EventService { private readonly HttpClient _httpClient; public EventService(HttpClient httpClient) { _httpClient = httpClient; } public async Task<IEnumerable<EventDto>> GetEventsByProviderCity( int pageCount, int page, string provider, string location) { var url = $"api/auction-events?pageCount={pageCount}&page={page}&provider={Uri.EscapeDataString(provider)}&city={Uri.EscapeDataString(location)}"; return await _httpClient.GetFromJsonAsync<IEnumerable<EventDto>>(url) ?? Enumerable.Empty<EventDto>(); } }
关键说明
Blazor WASM本质是前端应用,所有涉及数据库、文件系统等底层资源的操作必须通过后端服务(你的Api层)完成,浏览器环境不允许直接访问这些资源。保持前后端职责分离,既符合安全规范,也能避免这类平台兼容性问题。
内容的提问来源于stack exchange,提问作者Haris Tirić
相关产品推荐
相关产品推荐

