HTTP1切换至HTTP2后API返回ReasonPhrase为空的解决咨询
HTTP/2下无法获取ReasonPhrase的解决方案
HTTP/2协议**移除了Reason Phrase(原因短语)**这一字段,这是协议设计上的变更——HTTP/1.x中的Reason Phrase属于冗余信息,HTTP/2为提升传输效率直接砍掉了该部分。所以不管后端如何设置ReasonPhrase属性,前端都无法通过常规方式获取到。
结合你"同一StatusCode对应多个不同ReasonPhrase"的需求,给出以下替代方案:
方案1:将自定义错误信息放入响应体
直接把需要区分的原因信息嵌入响应体,前端通过解析响应内容获取。如果需要结构化处理,可将响应体改为JSON格式。
后端代码调整
actionContext.Response = new System.Net.Http.HttpResponseMessage() { StatusCode = HttpStatusCode.Unauthorized, Content = new StringContent(JsonConvert.SerializeObject(new { Reason = "Error", Detail = "Token is not assigned to the logged in user" }), Encoding.UTF8, "application/json") };
前端jQuery Ajax处理
error: function (XMLHttpRequest) { const errorInfo = JSON.parse(XMLHttpRequest.responseText); console.log(errorInfo.Reason); // 获取自定义区分标识 console.log(errorInfo.Detail); // 获取详细错误描述 }
方案2:使用自定义响应头
通过添加自定义HTTP响应头传递原ReasonPhrase内容,若涉及跨域(CORS),需配置后端允许前端读取该自定义头。
后端代码调整
var response = new System.Net.Http.HttpResponseMessage() { StatusCode = HttpStatusCode.Unauthorized, Content = new StringContent("Token is not assigned to the logged in user") }; // 添加自定义响应头 response.Headers.Add("X-Custom-Reason", "Error"); // 跨域场景需配置允许暴露该头(以ASP.NET为例) // services.AddCors(options => options.AddPolicy("CorsPolicy", policy => // policy.WithExposedHeaders("X-Custom-Reason"))); actionContext.Response = response;
前端jQuery Ajax处理
error: function (XMLHttpRequest) { const customReason = XMLHttpRequest.getResponseHeader("X-Custom-Reason"); console.log(customReason); // 获取自定义区分标识 }
内容的提问来源于stack exchange,提问作者Ibrahim shaikh
相关产品推荐
相关产品推荐

