2

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

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

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

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

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

4

1 回答 1

2

听起来您希望 Azure Functions 作为反向代理运行。

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

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

于 2017-12-06T21:58:21.480 回答