我有一个 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 负责序列化和序列化字符串。我知道如何在客户端代码上解决这个问题,首先反序列化为字符串,然后反序列化为所需的对象,但这似乎有点困难。
有办法阻止这种情况发生吗?我见过的所有解决此问题的示例都不适合这种情况。
您可以直接将原始 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"
}