以静默方式将 api 资源移动到另一个 url



我用WepApi 2编写的api与主网站紧密结合。 我决定将其解耦到另一个 Web 应用程序,以使事情更加孤立。

我遵循了以下步骤:

  1. 将所有 API 控制器提取到另一个项目
  2. 创建属性,用于将当前使用旧URL的所有用户重定向到新URL。出于这些原因,我使用了 307 状态代码,因为我们应该保留用户请求的动词和请求有效负载。

        var response = request.CreateResponse(HttpStatusCode.TemporaryRedirect); //307
        response.Headers.Location = new Uri($"{appConfig.ApiAppDomain}" + "/" + request.RequestUri.AbsolutePath + request.RequestUri.Query);
        return response;
    

总的来说,它工作得很好。客户端得到 307,然后跟随标头Location URL。

问题就在这里:主 Web 应用程序https,新 API http .当我使用邮递员时,它的行为很奇怪,并且确实将POST请求替换为GET请求,并带有所有请求的正文切割。一点也不好,很奇怪,因为307不允许更改方法和有效载荷。

所以这里有几个问题:

  1. 处理此https -> http重定向的最佳方法是什么?
  2. 这是否是好的解决方案?
  3. 用户静默移动到新 api url 的最佳解决方案是什么?

302,301 等 该事项的重定向将仅是 GET 请求。但是,从技术上讲,对于307,浏览器可以发出POST请求。更多细节在这里 .但是,进行重定向并不是一个好主意,这将为每个请求进行不必要的往返。它还可能导致其他问题,如跨域调用(如果您正在进行 Ajax REST API 调用或浏览器将验证所有资源是否仅从 https 加载(混合内容警告(

处理此https -> http重定向的最佳方法是什么?

我们不应该进行重定向,因为它可能会导致许多问题,正如我上面解释的那样

这是否是好的解决方案?

在这种情况下,重定向不是一个好的解决方案。

将用户静默移动到新 api url 的最佳解决方案是什么?

在我看来,在这种情况下,最好的解决方案是设置一个透明的代理,该代理也将执行https卸载。这也会使您的客户端发生零变化。以下是我们如何设置它。

  • 在 IIS 中为发送到您的 API 的任何请求设置反向代理。

    • 参考这个,设置API的反向代理和这个 -一旦你遵循上述任何一篇文章,你就会有一个这样的urlrewrite规则

    <?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="ReverseProxyInboundRule2" stopProcessing="true"> <match url="api/(.*)" /> <action type="Rewrite" url="http://server2/api/{R:1}" logRewrittenUrl="true" /> <conditions> </conditions> </rule> </rules> </rewrite> </system.webServer> </configuration>

在上面的 urlrewrite 规则中,如果请求的 url 包含通过 http 的 api,则将请求转发到 server2。因此,直到此服务器,请求将来自https,然后从那里将转到http上的服务器2。这将是本地请求(不是通过互联网(,延迟可以忽略不计。所以流程会是这样的

浏览器 =>https(https://example.com/api/products/2( =>http(http://server2/api/products/2(

  • 从原始网站中完全删除 API 代码。包括重定向逻辑,这将使您的网站完全没有API实现

只是总结这种方法的优点

  1. 在客户端不需要更改,客户甚至不知道这样的事情正在发生。因此,客户端没有额外的往返旅行。
  2. 您的流量将是完整的https,并且在您的主网站之外没有https到http。
  3. 如果您在主网站
  4. 中有主网站和 API 调用,则不会创建跨域调用或混合内容警告。 4.您已将主网站与API代码完全隔离。

最新更新