我有一个本地 ASP.NET Web API,用于查询本地数据。该计划是让客户端 Web 应用程序调用 Azure 函数,该函数将处理身份验证 (Azure AD B2C) 并验证请求,然后再将请求实际转发到本地 API 本身(通过 VPN)。
API 正在生成指向 API 本身的超媒体链接。当直接查询 API 时,这非常有效,因为每个链接都有助于发现应用程序。
此 API 目前在组织内本地使用,但我们现在需要公开它,以便可以通过网络使用它。我们不想直接公开 API,我们宁愿通过一个可以验证、验证和执行我们可能需要的任何其他逻辑的函数应用程序来路由它。
我的问题是,如何将这些 URL 转换为 Azure Function 中的端点?也就是说,我真的希望使用的 Web 应用程序能够直接使用这些超媒体链接,并让 Azure Function 将它们路由到正确的 API 端点。
在理想的情况下,我们会在客户端上公开链接,这些链接将映射到资源。由于 API 没有公开,我们如何通过 Function App 路由它?
最佳答案
听起来您想要的是 Azure Functions 作为 reverse proxy 运行.
实现这一目标的一个技巧是使用一个 HttpTrigger 来捕获到达函数应用程序的所有流量。您可以通过设置属性 route: "{*uri}"
和 methods: ["get", "post", "put", "patch", "delete"] 来完成此操作
。您可以根据需要将其他 HTTP 方法添加到 function.json
中的 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 所示。 .
关于azure - 根据环境调整超媒体链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47674415/