ASP.NET Core Web API代理中JSON序列化额外引号问题解决方案咨询
解决ASP.NET Core代理API返回JSON带额外引号的问题
问题根源
你遇到的额外引号是重复序列化导致的:第三方API返回的已经是合法的JSON字符串,你却用JsonSerializer.SerializeToUtf8Bytes把这个字符串当成普通字符串再次序列化,最终结果就是外层多了一层引号。
解决方案
方案1:直接输出原始JSON字节(快速修复)
修改ModifyResponse方法,跳过二次序列化,直接将原始JSON字符串转成UTF8字节写入响应体:
private static async Task ModifyResponse(HttpContext context, string json) { context.Response.ContentType = "application/json"; var jsonBytes = Encoding.UTF8.GetBytes(json); await context.Response.Body.WriteAsync(jsonBytes); }
方案2:直接转发响应流(推荐,性能最优)
避免将第三方响应转成字符串,直接把响应流复制到当前请求的响应体中,既节省内存开销,又能完整保留第三方API的状态码、响应头等信息:
private async Task ForwardRequest(HttpContext context) { using var httpClient = new HttpClient(); // 构造目标API的请求地址 var targetUrl = $"你的第三方API基础地址{context.Request.Path}{context.Request.QueryString}"; // 构建转发的请求消息 using var requestMsg = new HttpRequestMessage( new HttpMethod(context.Request.Method), targetUrl ); // 复制原请求的请求头(可根据需求过滤不需要的头) foreach (var header in context.Request.Headers) { if (!requestMsg.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray()) && requestMsg.Content != null) { requestMsg.Content.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray()); } } // 复制原请求的请求体(针对POST/PUT等带请求体的方法) if (context.Request.ContentLength > 0) { requestMsg.Content = new StreamContent(context.Request.Body); } // 发送请求并获取响应 using var responseMsg = await httpClient.SendAsync( requestMsg, HttpCompletionOption.ResponseHeadersRead ); // 复制第三方响应的状态码 context.Response.StatusCode = (int)responseMsg.StatusCode; // 复制第三方响应的响应头 foreach (var header in responseMsg.Headers) { context.Response.Headers.TryAdd(header.Key, header.Value.ToArray()); } foreach (var header in responseMsg.Content.Headers) { context.Response.Headers.TryAdd(header.Key, header.Value.ToArray()); } // 直接将第三方响应流复制到当前响应体 await responseMsg.Content.CopyToAsync(context.Response.Body); }
方案3:先反序列化再序列化(需修改JSON内容时用)
如果需要对第三方返回的JSON做修改(比如新增/删除字段),可以先把JSON字符串反序列化成对象,再序列化写入响应:
private static async Task ModifyResponse(HttpContext context, string json) { context.Response.ContentType = "application/json"; // 反序列化为动态对象或具体业务模型 var responseObj = JsonSerializer.Deserialize<object>(json); // 这里可以对responseObj做修改操作 await context.Response.Body.WriteAsync(JsonSerializer.SerializeToUtf8Bytes(responseObj)); }
内容的提问来源于stack exchange,提问作者DecentWig
相关产品推荐
相关产品推荐

