将api资源静默移动到另一个网址

时间:2017-06-30 17:31:56

标签: asp.net http iis asp.net-web-api

我已经用WepApi 2与主网站紧密结合编写了api。 我决定将它与其他网络应用程序分离,以使事情更加孤立。

我遵循了以下步骤:

  1. 将所有API控制器解压缩到另一个项目
  2. 广告属性,用于将当前使用旧网址的所有用户重定向到新网址。由于这些原因,我使用了307 status code,因为我们应该保留用户请求的动词并请求有效负载。

        var response = request.CreateResponse(HttpStatusCode.TemporaryRedirect); //307
        response.Headers.Location = new Uri($"{appConfig.ApiAppDomain}" + "/" + request.RequestUri.AbsolutePath + request.RequestUri.Query);
        return response;
    
  3. 通常它很好用。客户端获得307,然后跟随Location标题中的URL。

    问题在于:主要网络应用为https,新的API为http。当我使用邮递员时,它表现得很奇怪,并且用POST请求替换GET请求,同时请求所有请求的正文剪切。一点都不好而且很奇怪,因为307不允许更改方法和有效负载。

    所以这里有几个问题:

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

1 个答案:

答案 0 :(得分:3)

302,301等重定向只是GET请求。但是从技术上来说,浏览器可以发出POST请求。更多详细信息here。但是重定向不是一个好主意每次请求的往返行程。也可能导致其他问题,如跨域调用(如果您正在进行Ajax REST API调用或浏览器将验证所有资源仅从https加载(Mixed content warning

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

  

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

它是否是一个好的解决方案?

  

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

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

  

在我看来,这种情况下的最佳解决方案是设置一个透明代理,它也可以执行https卸载。这也将对您的客户端进行零更改。这就是我们如何设置它。

  • 在IIS中为任何进入API的请求设置反向代理。

    <?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规则中,如果请求的网址包含 api ,那么您将把请求转发给server2,这将超过http.So,直到此服务器请求将在https上发布并从那里开始将在http上发送到服务器2.但这不符合客户的知识。这将是本地请求(不是通过互联网),延迟可以忽略不计。所以流程将是这样的

  

浏览器=&gt; https(https://example.com/api/products/2)=&gt;   HTTP(http://server2/api/products/2

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

只是总结了这种方法的优点

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