ASP.NET Core Web API:将 Json 序列化为字符串

问题描述 投票:0回答:1

我有一个 ASP.NET Core Web API,我将其用作另一个第三方 API 的代理。我有一些端点,我有一个控制器,但我也充当第三方 API 的代理,用于发送给我的所有其他请求,但我没有自定义端点。我基本上将这些请求转发给第三方 API。

我有一些自定义中间件来处理传入的请求。如果我有一个用于请求的自定义端点,我会调用

_next.Invoke
。如果没有,我会将请求转发给第三方 API。

    public async Task Invoke(HttpContext context)
    {
        if (IsCustomEnpoint(context))
        {
            await _next.Invoke(context);
        }
        else 
        {
            await ForwardRequest(context);
        }
        return;
    }

当我调用

ForwardRequest
时,我使用
HttpClient
发送请求并以字符串形式返回一些 JSON,并使用以下方法修改
HttpContext
:

private static async Task ModifyResponse(HttpContext context, string json)
{
    context.Response.ContentType = "application/json";
    await context.Response.Body.WriteAsync(JsonSerializer.SerializeToUtf8Bytes(json));
}

这样做会在 json 周围添加额外的引号,因此原始请求者会收到:

"{
  "name": "Bob Boberty",
}"

而不是

{
  "name": "Bob Boberty",
}

据我了解,这是因为 Web API 负责序列化和序列化字符串。我知道如何在客户端代码上解决这个问题,首先反序列化为字符串,然后反序列化为所需的对象,但这似乎有点困难。

有办法阻止这种情况发生吗?我见过的所有解决此问题的示例都不适合这种情况。

c# .net-core asp.net-core-webapi
1个回答
0
投票

您可以直接将原始 JSON 字符串写入响应正文,无需进一步序列化。以下是如何修改修改响应方法以避免双重序列化

private static async Task ModifyResponse(HttpContext context, string json)
{
    context.Response.ContentType = "application/json";

    // Convert the raw JSON string to bytes and write it to the response
    var jsonBytes = Encoding.UTF8.GetBytes(json);
    await context.Response.Body.WriteAsync(jsonBytes, 0, jsonBytes.Length);
}

输出应该是

{
  "name": "Bob Boberty"
}
© www.soinside.com 2019 - 2024. All rights reserved.