如何通过 ASP.NET Core 3 中的中间 Web API 传递未更改的 HTTP 响应?

Posted

技术标签:

【中文标题】如何通过 ASP.NET Core 3 中的中间 Web API 传递未更改的 HTTP 响应?【英文标题】:How to pass a HTTP response unchanged through an intermediate Web API in ASP.NET Core 3? 【发布时间】:2020-08-12 18:23:40 【问题描述】:

在 ASP.NET Core 3 中,从我的站点(服务器端)调用我信任的 Web API 并在我的站点上传递其响应的最佳方式是什么?

例如,我有一个像这样的控制器操作,我想从调用中获取任何 HTTP 状态和 JSON 数据等。

[HttpGet]
public async Task<IActionResult> Get(int id)
   string url = "https://...";
   return await httpClient.GetAsync(url);  // not quite right...

但是,GetAsync 返回一个 HttpResponseMessage。我应该将其转换为 IActionResult 吗?如果是这样,我怎么能这样做而不求助于 Microsoft.AspNetCore.WebApiCompatShim 的 System.Web.Http.ResponseMessageResult (因为我不需要与旧的 Web API 约定兼容)?我觉得我缺少一种更简单的方法。

(当然,我希望这里的方法开销最小,因为我不寻求转换或增加响应。尤其是没有反序列化。)

【问题讨论】:

【参考方案1】:

您可以做的最简单的事情就是返回字符串结果。使用这种方法,您将需要在客户端解析 Json 字符串。

[HttpGet]
public async Task<IActionResult> Get(int id)
   string url = "https://...";
   return await httpClient.GetStringAsync(url);

如果你想返回一个 json 对象,你将不得不对它进行模型绑定。

[HttpGet]
public async Task<MyType> Get(int id)
   string url = "https://...";
   var content = await httpClient.GetStringAsync(url);
   // this is Newtonsoft.Json, use the System.Text.Json if you are on .net core 3.*
   return JsonConvert.DeserializeObject<MyType>(content);

【讨论】:

如果我调用 GetStringAsync,我会丢失 HTTP 状态,对吧? 我很想在失败的情况下传递状态。 @PatrickSzalapski 您从 HttpClient 获得的响应对象与 asp.net 核心生成的响应对象不同。您将需要创建自定义绑定。 @PatrickSzalapski 或者尝试这样的事情? ***.com/questions/42000362/… 是的,AspNetCore.Proxy 包正是我所需要的。谢谢。【参考方案2】:

你可以试试:

[HttpGet]
public async Task<IActionResult> Get()

    HttpClient httpClient = new HttpClient();
    string url = "http://localhost:...";
    var response =   await httpClient.GetAsync(url);
    var statusCode = response.StatusCode;
    string responseBody = await response.Content.ReadAsStringAsync();
    return Ok(new  StatusCode = statusCode,ResponseBody = responseBody);

【讨论】:

在 4xx 或 5xx 的情况下不会传递 HTTP 状态码吗?

以上是关于如何通过 ASP.NET Core 3 中的中间 Web API 传递未更改的 HTTP 响应?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ASP.NET Core 2.0 中的自定义中间件请求身份验证

Asp.Net Core 通过中间件防止图片盗链

ASP.Net Core 2.0 如何获取中间件中的所有请求标头? [复制]

写入自定义 ASP.NET Core 中间件

ASP.NET Core 2.1 中的 HttpClientFactory (Part 3) 使用Handler实现传出请求中间件

Asp.Net Core 第06局:中间件