【问题标题】:How to pass a HTTP response unchanged through an intermediate Web API in ASP.NET Core 3?如何通过 ASP.NET Core 3 中的中间 Web API 传递未更改的 HTTP 响应?
【发布时间】: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 约定兼容)?我觉得我缺少一种更简单的方法。

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

【问题讨论】:

    标签: asp.net-core asp.net-web-api asp.net-core-3.1


    【解决方案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 或者尝试这样的事情? stackoverflow.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 状态码吗?
    猜你喜欢
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 2020-07-06
    • 2020-05-10
    • 2016-08-03
    • 1970-01-01
    相关资源
    最近更新 更多