【问题标题】:Stream from one REST API as response to client Web API从一个 REST API 流式传输作为对客户端 Web API 的响应
【发布时间】:2019-06-09 20:18:43
【问题描述】:

我有一个供应商休息 API,我们可以返回大量的 json 数据。我们不能让我们的客户直接访问这个 API,所以我们所做的是创建我们自己的 REST API (C# WebAPI) 来接收来自客户客户的请求。

然后,我们的 Web API 会处理数据,并向供应商 rest API 发出请求以及所需的凭据。

我们不对从供应商 API 返回的数据进行任何操作。

我想返回从供应商的 REST API 返回的相同流,但我不想等到流关闭。一旦我们开始接收来自供应商 REST API 调用的数据,我希望将相同的数据从我们的 REST API 返回给客户端调用者。

这将提供巨大的性能优势并大大降低扩展成本。

客户端 ------调用我们的 REST API----> {OUR REST API} --------调用供应商 REST API ------> {供应商的 REST API}

我们如何在 C# 中完成这样的事情?

        [HttpGet]
        public async Task<IActionResult> Get([FromQuery]SearchQuery queryParam)
        {
            string apiKey = _configuration.GetValue<string>("VendorAPIKey");
string restUrl = "https://vendorresturl.com/api/search?kajhfjhsdf";

            var hclient = new HttpClient();
            hclient.DefaultRequestHeaders.Add("api-key", apiKey);

            var responseMessage = await hclient.GetAsync(restUrl.ToString());

            var c = new ContentResult();
            c.ContentType = "application/json";
            c.Content = await responseMessage.Content.ReadAsStringAsync();

            return c;
    }

【问题讨论】:

  • 显示您已经拥有的读取他们响应的代码;这似乎是一个微不足道的“获取供应商响应流并开始从中读取,获取您自己的客户端的响应流并开始循环写入”场景
  • 这看起来很简单,请显示一些代码。
  • 好的。我添加了一个代码示例。在这里,您可以看到它读取了完整的响应,然后将其发送回客户端。问题是,这比客户端直接调用我们供应商的 REST API 慢 10 倍……如果我们可以在收到响应时流回响应,我们可以大大提高性能……
  • 因此您希望您的 API 本质上使用您自己的凭据充当“反向代理”。我会建议现成的产品,如 Azure API 网关或 AWS API 网关或 APIgee。所有这些产品都相对便宜且不必担心维护性和可扩展性等。

标签: c# asp.net .net rest asp.net-web-api


【解决方案1】:

我建议您在代码中更改两点:

1) 只需获取此 API 一次,将其放入服务中,将这个 Key 保存为单例变量。这样控制器会第一次做一个just请求,之后key值就会在存储的singleton变量中得到。

2) 使用事件回调模式使您的流程完全异步,提供回调 url 以在流程结束后 webhook 能够发送流程的结果。

阅读这些文章可以帮助您:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 2020-12-20
    • 1970-01-01
    相关资源
    最近更新 更多