jQuery调用返回Task<ActionResult<List<ApiObject>>>的GET接口报500错误
问题根因
从你提供的错误栈可直接定位核心问题:System.InvalidOperationException: Sequence contains more than one element 是调用LINQ的Single()方法时,目标序列匹配到了多条数据触发的异常,错误出现在SiteController.cs第167行、Select方法的委托逻辑中。
你当前贴出的Select赋值代码是简化版本,实际你在给ApiObject某个字段赋值时,存在未贴出的a.关联属性.Single()类的逻辑。
为什么Angular调用正常、jQuery调用异常
两种请求的上下文不一致,导致数据库查询返回的数据集不同:
- Angular发送请求时会自动携带站点的身份认证凭证(Cookie/Token),后端识别用户身份后,按权限过滤得到的数据集刚好符合
Single()的调用要求 - 你写的jQuery ajax默认没有携带身份凭证,后端识别为无权限/未登录用户,查询得到的关联数据出现重复,触发
Single()报错
另外你现有的jQuery事件绑定写法也存在问题,直接写on(ajax, "click")会因为找不到ajax变量触发语法错误。
修复方案
第一步:修正jQuery请求代码
补充身份凭证携带逻辑,修正事件绑定写法:
$("#ajax").click(function(event) { alert('ajax'); $.ajax({ type: "GET", data: {SiteId: 8}, dataType: "json", // 携带跨域/同域身份凭证,和Angular请求上下文保持一致 xhrFields: { withCredentials: true }, url: "https://localhost:44310/api/site/search", success: function(data){ alert(JSON.stringify(data)); }, error: function(xhr) { console.error(xhr.responseText); } }); });
第二步:修复后端逻辑鲁棒性
找到SiteController.cs第167行的Single()调用,根据业务场景调整:
- 若业务允许多条数据取第一条,替换为
FirstOrDefault()并补充空值判断 - 若业务要求该序列必须仅有一条数据,先补充
Distinct()去重逻辑,再替换为SingleOrDefault(),同时添加异常兜底处理
临时排查验证方法
在控制器Search方法入口添加日志,分别打印Angular请求和jQuery请求的User.Identity.IsAuthenticated、传入的SiteId值,可快速确认两者的请求上下文差异。
内容的提问来源于stack exchange,提问作者For Comment
相关产品推荐
相关产品推荐

