根据环境调整超媒体链接

Adapting hypermedia links based on environment

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

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

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

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

在理想情况下,我们会在客户端公开链接,这些链接会映射到资源。由于 API 没有暴露,我们如何通过功能应用程序路由它?

听起来你想要的是让 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.