根据环境调整超媒体链接

时间:2017-12-06 12:33:35

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

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

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

此API目前在组织内部使用,但我们现在需要公开它,以便可以通过Web使用它。我们不希望直接暴露API,我们宁愿通过功能应用程序来路由它,该功能应用程序可以验证,验证和执行我们可能需要的任何其他逻辑。

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

在理想的世界中,我们会在客户端上显示链接,这些链接将映射到资源。由于API未公开,我们如何通过功能应用程序进行路由?

1 个答案:

答案 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所示。