ASP.NET Core调用API时触发InvalidOperationException错误求助
ASP.NET Core InvalidOperationException 问题修复
错误信息
InvalidOperationException: 传入ViewDataDictionary的模型项类型为
System.Threading.Tasks.Task,但该ViewDataDictionary需要的模型项类型为System.Collections.Generic.IEnumerable<WebConsumoApi.Models.Product>。
核心问题分析
- 控制器未等待异步方法执行完成,直接将
Task对象传递给视图 - API调用方法无返回值,且反序列化逻辑错误(将列表数据反序列化为单个
Product对象) - GET请求错误设置请求体,不符合HTTP规范
- 接口方法签名与实际需求不匹配,无法提供视图所需的列表数据
代码修复步骤
1. 修复API调用代码
调整方法返回类型,移除无效请求体,修正反序列化逻辑:
public async Task<IEnumerable<Product>> ListAsync() { using var client = new HttpClient { BaseAddress = new Uri("https://teste.teste1.com.br") }; client.DefaultRequestHeaders.Add("x-user-email", "victor@teste.com.br"); client.DefaultRequestHeaders.Add("x-api-key", "eyJ0eXAiOiJKV1QiLCJhbGcxYg"); client.DefaultRequestHeaders.Add("x-store-key", "1"); client.DefaultRequestHeaders.Add("accept", "application/json;charset=UTF-8"); // GET请求无需设置Content,直接创建请求消息 HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Get, "/app/Api/V1/Products/list"); using var res = await client.SendAsync(req); res.EnsureSuccessStatusCode(); var responseBody = await res.Content.ReadAsStringAsync(); // 反序列化为产品列表(若API返回包裹类,需对应调整模型) return JsonSerializer.Deserialize<IEnumerable<Product>>(responseBody); }
2. 修复接口IProduto方法签名
using WebConsumoApi.Models; namespace WebConsumoApi.Interfaces { public interface IProduto { // 修改为返回产品列表的异步方法 Task<IEnumerable<Product>> ListAsync(); Product Create(Product produto); Product Update(Product produto); Product GetOne(string Codigo); Product Delete(string Codigo); } }
3. 修复控制器Index方法
添加await获取异步执行结果,再传递给视图:
// GET: ProdutosController public async Task<ActionResult> Index() { var products = await _IProduto.ListAsync(); return View(products); }
4. 视图代码修正
修复视图中一处变量引用错误:
<td> @Html.DisplayFor(modelItem => item.list_price) </td>
额外优化建议
- 使用
IHttpClientFactory替代直接实例化HttpClient,避免套接字耗尽问题 - 添加异常捕获逻辑,处理API调用失败场景
- 确认API返回JSON结构与
Product类字段匹配,必要时添加JsonPropertyName特性映射字段
内容的提问来源于stack exchange,提问作者VICTOR MARCONI SANTOS DE OLIVE
相关产品推荐
相关产品推荐

