ASP.NET Core中如何用HttpClient接收并透传未知类型JSON?
ASP.NET Core透传JSON的解决方案
你的问题核心是上游服务器返回了双重序列化的JSON(即把JSON数组先序列化成字符串再返回),同时透传服务不需要解析内容,直接转发原始响应即可,没必要纠结于解析成对象。以下是具体实现方案:
最优方案:直接转发上游响应流
透传服务不需要解析JSON内容,直接将上游服务器的原始响应流转发给客户端是最高效的方式,完全避免转义、序列化/反序列化问题:
代码示例(ASP.NET Core Controller)
using System.Net; using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; [ApiController] [Route("proxy")] public class ProxyController : ControllerBase { private readonly IHttpClientFactory _httpClientFactory; // 通过依赖注入获取HttpClientFactory public ProxyController(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; } [HttpGet] public async Task<IActionResult> ForwardJson() { var httpClient = _httpClientFactory.CreateClient(); // 使用HttpCompletionOption.ResponseHeadersRead,避免提前加载整个响应到内存 var upstreamResponse = await httpClient.GetAsync("https://上游服务器接口地址", HttpCompletionOption.ResponseHeadersRead); // 确保上游请求成功,失败则抛出异常或返回对应状态码 upstreamResponse.EnsureSuccessStatusCode(); // 复制上游响应的Content-Type等头信息 foreach (var header in upstreamResponse.Content.Headers) { Response.Headers.TryAdd(header.Key, new Microsoft.Extensions.Primitives.StringValues(header.Value.ToArray())); } // 将上游响应流直接写入当前客户端响应流 await using var stream = await upstreamResponse.Content.ReadAsStreamAsync(); await stream.CopyToAsync(Response.Body); await Response.Body.FlushAsync(); return new EmptyResult(); } }
若必须解析内容的处理方式
如果确实需要先解析上游返回的转义字符串,再处理或转发,可以先将转义字符串反序列化为原始JSON字符串,再操作:
// 先获取上游返回的转义字符串 var escapedJsonString = await httpClient.GetStringAsync("上游服务器接口地址"); // 反序列化得到原始JSON字符串 var rawJson = Newtonsoft.Json.JsonConvert.DeserializeObject<string>(escapedJsonString); // 此时rawJson就是上游原本的JSON内容:[{"id":1,"name":"Sleep","isComplete":false}] // 可以直接返回给客户端,或者继续解析为JToken/JObject var jsonToken = Newtonsoft.Json.Linq.JToken.Parse(rawJson);
为什么之前的方法无效?
你用GetStringAsync拿到的带转义的字符串,本质是上游服务器返回的字符串类型的JSON(即上游把JSON数组序列化了一次),所以直接用JObject.Parse或JsonConvert.DeserializeObject<dynamic>会失败——因为这些方法是把JSON字符串解析为对象,而你传入的是一个被转义的字符串(本身是JSON的字符串值)。
内容的提问来源于stack exchange,提问作者ILIA BROUDNO
相关产品推荐
相关产品推荐

