【问题标题】:Adapting hypermedia links based on environment基于环境适配超媒体链接
【发布时间】:2018-05-20 08:12:04
【问题描述】:

我有一个用于查询本地数据的本地 ASP.NET Web API。该计划是让客户端 Web 应用程序调用一个 Azure 函数,该函数将处理身份验证 (Azure AD B2C) 并在实际将请求转发到本地 API 本身(通过 VPN)之前验证请求。

API 正在生成指向 API 本身的超媒体链接。这在直接查询 API 时效果很好,因为每个链接都有助于发现应用程序。

此 API 目前在组织内本地使用,但我们现在需要公开它,以便可以在网络上使用它。我们不想直接公开 API,我们宁愿通过一个可以进行身份​​验证、验证和执行我们可能需要的任何其他逻辑的函数应用程序来路由它。

我的问题是,如何将这些 URL 转换为 Azure 函数中的端点?即,我真的希望消费 Web 应用程序能够直接使用这些超媒体链接,并让 Azure 函数将它们路由到正确的 API 端点。

在理想情况下,我们会在客户端上公开链接,这些链接将映射到资源。由于 API 没有暴露,我们如何通过 Function App 进行路由?

【问题讨论】:

    标签: azure asp.net-web-api asp.net-web-api2 azure-functions azure-function-app-proxy


    【解决方案1】:

    听起来您想要让 Azure Functions 作为reverse proxy 运行。

    实现这一点的一个技巧是使用一个 HttpTrigger 来捕获所有到达您的函数应用程序的流量。您可以通过在function.json 中设置属性route: "{*uri}"methods: ["get", "post", "put", "patch", "delete"] 来做到这一点。您可以根据需要将其他 HTTP 方法添加到 methods 列表。这些应该以“https://{app-name}.azurefunctions.net/api/*”形式捕获所有请求。

    下面的代码粗略地说明了如何实现从函数应用到未公开 API 的重定向。在当前的表示中,/api/ 之后的相对 URI 路径将被重定向到具有完全相同的正文请求的未公开 api。

    using System.Net;
    
    public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
    {
        //Validation logic here
    
        string actualUrl = "{hosturl}/";
        string proxyUrl = "https://{app-name}.azurewebsites.net/api/";
    
        req.RequestUri = new Uri(req.RequestUri.ToString().Replace(proxyUrl, actualUrl));
        req.Headers.Host = req.RequestUri.Host;
        using(var client = new HttpClient())
        {
            return await client.SendAsync(req);
        }
    }
    

    您现在可以生成指向您的函数主机名的所有超媒体链接,并且它们将被正确重定向。

    注意:如果您希望函数的许多实例会启动(即您的函数的并发使用率很高),那么您可能会遇到 SocketException 错误,如 here 所记录的那样。

    【讨论】:

    • 谢谢,我有点希望有一种方法可以使用实际的反向代理功能(或类似的功能)来做到这一点,但这应该可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 2014-12-30
    • 2012-08-30
    • 2013-05-11
    • 2015-03-15
    • 1970-01-01
    • 2021-09-26
    相关资源
    最近更新 更多