.NET6 Blazor WASM客户端CS类Post请求无法触发服务端控制器
问题分析与解决方案
以下是导致请求未触发服务端控制器的核心原因及修正方案:
1. 客户端HttpClient使用方式错误
Blazor WASM中禁止手动实例化HttpClient,应通过依赖注入获取框架预配置的实例。手动创建的HttpClient缺少框架默认的CORS、BaseAddress等配置,会导致请求无法正确到达服务端。
修正后的客户端代码:
// 依赖注入HttpClient(在类构造函数中注入) private readonly HttpClient _httpClient; public YourAuthService(HttpClient httpClient) { _httpClient = httpClient; // 若需自定义BaseAddress,可在此设置(通常框架已自动配置为服务端API地址) // _httpClient.BaseAddress = new Uri(Parameters.urlstring); } // 发起刷新请求的异步方法 public async Task<YourResponseModel> RefreshAuthentication() { var jsonContent = JsonConvert.SerializeObject(authcookie_value); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); // 必须使用await等待请求完成,否则请求会被中途终止 var response = await _httpClient.PostAsync("/api/auth/refresh", content); response.EnsureSuccessStatusCode(); // 可选:强制检查请求是否成功 return await response.Content.ReadFromJsonAsync<YourResponseModel>(); }
2. 未等待异步请求执行完成
原代码中httpClient.PostAsync未添加await关键字,导致请求仅被触发但未等待执行完成,上下文提前结束后服务端无法收到完整请求。必须通过await确保请求执行完毕。
3. 服务端控制器参数类型错误
StringContent是客户端System.Net.Http命名空间下的类型,服务端控制器无法直接接收该类型参数。需改用符合请求体格式的参数:
方案一:使用强类型模型(推荐)
// 定义与请求体结构匹配的模型类 public class AuthRefreshRequest { // 根据authcookie_value的实际结构定义属性 public string AuthCookie { get; set; } } [HttpPost, Route("/api/auth/refresh")] public IActionResult AuthRefresh([FromBody] AuthRefreshRequest request) { try { // 处理request.AuthCookie逻辑 return Ok("刷新成功"); } catch { return StatusCode(StatusCodes.Status500InternalServerError, "刷新失败"); } }
方案二:直接接收JSON字符串
[HttpPost, Route("/api/auth/refresh")] public IActionResult AuthRefresh([FromBody] string authCookieValue) { try { // 处理authCookieValue逻辑 return Ok("刷新成功"); } catch { return StatusCode(StatusCodes.Status500InternalServerError, "刷新失败"); } }
4. 可选:检查CORS配置
若客户端与服务端跨域部署,需确保服务端配置了允许客户端域名的CORS策略:
在服务端Program.cs中添加:
builder.Services.AddCors(options => { options.AddPolicy("AllowBlazorClient", policy => { policy.WithOrigins("https://your-blazor-client-domain.com") .AllowAnyHeader() .AllowAnyMethod(); }); }); // 在UseRouting之后、UseAuthorization之前添加 app.UseCors("AllowBlazorClient");
内容的提问来源于stack exchange,提问作者Stavros Koureas
相关产品推荐
相关产品推荐

