如何通过 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 2.0 如何获取中间件中的所有请求标头? [复制]
ASP.NET Core 2.1 中的 HttpClientFactory (Part 3) 使用Handler实现传出请求中间件