我有一个内部部署的ASP.NET Web API,它正在查询本地数据。该计划是客户端Web应用程序调用Azure功能,该功能将处理身份验证(Azure AD B2C)并在将请求实际转发到内部部署API本身(通过VPN)之前验证请求。
API正在生成指向API本身的超媒体链接。这在直接查询API时非常有效,因为每个链接都有助于发现应用程序。
此API目前在组织内部使用,但我们现在需要公开它,以便可以通过Web使用它。我们不希望直接暴露API,我们宁愿通过功能应用程序来路由它,该功能应用程序可以验证,验证和执行我们可能需要的任何其他逻辑。
我的问题是,您如何将这些URL转换为Azure功能中的端点?即,我真的希望消费的Web应用程序能够直接使用这些超媒体链接,并让Azure功能将它们路由到正确的API端点。
在理想的世界中,我们会在客户端上显示链接,这些链接将映射到资源。由于API未公开,我们如何通过功能应用程序进行路由?
答案 0 :(得分:2)
听起来你想要的是Azure Functions作为reverse proxy。
运行实现这一目标的一个技巧是让一个HttpTrigger捕获到达您的函数应用程序的所有流量。您可以通过在route: "{*uri}"
中设置属性methods: ["get", "post", "put", "patch", "delete"]
和function.json
来执行此操作。您可以根据需要向methods
列表添加其他HTTP方法。这些应该以#34; 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所示。