Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 静默地将api资源移动到另一个url_Asp.net_Http_Iis_Asp.net Web Api - Fatal编程技术网

Asp.net 静默地将api资源移动到另一个url

Asp.net 静默地将api资源移动到另一个url,asp.net,http,iis,asp.net-web-api,Asp.net,Http,Iis,Asp.net Web Api,我已经用WepApi 2编写了api,它与主网站紧密结合。 我决定将它与另一个web应用程序分离,以使事情更加孤立 我遵循了这些步骤: 将所有API控制器提取到另一个项目 create属性将当前使用旧URL的所有用户重定向到新URL。出于这些原因,我之所以使用它,是因为我们应该保留用户请求的动词和请求负载 var response = request.CreateResponse(HttpStatusCode.TemporaryRedirect); //307 response.

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

我遵循了这些步骤:

  • 将所有API控制器提取到另一个项目
  • create属性将当前使用旧URL的所有用户重定向到新URL。出于这些原因,我之所以使用它,是因为我们应该保留用户请求的动词和请求负载

        var response = request.CreateResponse(HttpStatusCode.TemporaryRedirect); //307
        response.Headers.Location = new Uri($"{appConfig.ApiAppDomain}" + "/" + request.RequestUri.AbsolutePath + request.RequestUri.Query);
        return response;
    
  • 共同点是,它工作得很好。客户机得到307,然后在
    位置
    标题中找到URL

    问题就在这里:主要的web应用程序是
    https
    ,而新的api是
    http
    。当我使用postman时,它的行为会很奇怪,并且会将
    POST
    请求替换为
    GET
    请求,并使用所有请求的身体切割。一点也不好,很奇怪,因为
    307
    不允许更改方法和有效负载

    以下是几个问题:

  • 处理此https->http重定向的最佳方法是什么
  • 这到底是不是一个好的解决方案
  • 以静默方式将用户移动到新api url的最佳解决方案是什么

  • 302301 etc重定向仅适用于GET请求。但是从技术上讲,对于307,浏览器可以发出POST请求。更多详细信息。但重定向不是一个好主意,它会对每个请求进行不必要的往返。此外,它可能会导致其他问题,如跨域呼叫(如果您正在进行Ajax REST API调用,浏览器将验证所有资源是否仅从https加载()

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

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

    这到底是不是一个好的解决方案

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

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

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

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

      • 参考,以及 -一旦您阅读了上面的任何一篇文章,您将有一个如下的URL重写规则
      
      ) =>
      http()

      • 完全删除原始网站的API代码。包括重定向逻辑,这将使您的网站完全没有API实现
      只是总结一下这种方法的优点

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

    • 通常,新路由是通过版本控制来实现的,比如路由或标头中的v2。但是,由于您已经创建了一个完整的新API,我认为您不应该重定向。将两者视为单独的API。但一定要向您的客户提述,旧API在某个日期之前是受支持的,然后将被关闭。顺便说一句,我会将新API“升级”到https。给你一个更新。我的主站点是https,我想重写为http。到目前为止不起作用。)你有两个不同的网站吗?或者你在IIS中创建了新的Web应用程序而不是新的网站如果它只是另一个应用程序,并且你只在同一个网站中托管,那么这种方法仍然有效。在这种情况下,你不需要代理,只需重新编写url就可以了。浏览器=>https()=>(在iis中创建的新应用程序)。因此,在这种情况下,您只需将api/products/2的url重写为newapp/api/products/2即可。这是你想要的吗?