You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 12:17:34