ASP.NET Core返回Conflict()响应时如何携带额外上下文信息
问题解决方案
你之前后端传值的写法本身没有问题,没生效的核心原因是前端代码在检测到409状态码后,没有读取响应体携带的内容,直接弹出了固定提示文本。按以下两步修改即可:
后端Controller代码调整
直接将冲突相关的上下文信息作为参数传入Conflict()方法即可,ASP.NET Core 会自动将传入的对象序列化为JSON格式写入响应体,注意只返回前端需要展示的非敏感字段:
IEnumerable<DSR> changedDsrs = // DetectIfConflict(); if (changedDsrs.Any()) { return Conflict(new { message = "检测到并发冲突", conflictReleaseIds = changedDsrs.Select(d => d.ReleaseId.ToString()).ToList() }); }
前端JavaScript代码调整
在409状态码的处理分支中,增加响应体解析逻辑,读取后端返回的冲突信息后拼接进提示文本:
var response = await fetch("api/dsr/updateStatus", { method: "POST", headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); if (response.status == 409) { // 解析响应中携带的JSON格式错误信息 const errorInfo = await response.json(); // 拼接冲突详情 const conflictDetail = errorInfo.conflictReleaseIds.join(", "); alert(`Conflict detected. 触发冲突的ReleaseId:${conflictDetail}`); }
补充说明:fetch API 不会因为响应状态码为4xx/5xx自动中断流程或抛出错误,只要服务端正常返回响应,无论状态码是多少,都可以通过
response.json()/response.text()等方法读取响应体内容。
内容的提问来源于stack exchange,提问作者Zvi
相关产品推荐
相关产品推荐

