azure - 根据环境调整超媒体链接

标签 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 目前在组织内本地使用,但我们现在需要公开它,以便可以通过网络使用它。我们不想直接公开 API,我们宁愿通过一个可以验证、验证和执行我们可能需要的任何其他逻辑的函数应用程序来路由它。

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

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

最佳答案

听起来您想要的是 Azure Functions 作为 reverse proxy 运行.

实现这一目标的一个技巧是使用一个 HttpTrigger 来捕获到达函数应用程序的所有流量。您可以通过设置属性 route: "{*uri}"methods: ["get", "post", "put", "patch", "delete"] 来完成此操作function.json 中的 。您可以根据需要将其他 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 所示。 .

关于azure - 根据环境调整超媒体链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47674415/

相关文章:

powershell - 使用 SetParameters.xml 通过 powershell 将网站发布到 Azure

azure - Microsoft Azure AD 图形 API,如何在 Node js 中使用 botbuilder 版本 4 获取用户邮件响应?

c# - 注入(inject)和 WebAPI : Getting started after install from NuGet

asp.net-mvc - ASP.NET MVC Web API 和 StructureMap : "does not have a default constructor"

asp.net - Web Api 2 - 返回 NotFound(); vs 使用全局异常处理程序抛出异常

c# - Azure 连接字符串

azure - 使用 ARM 在 Azure Web App 上配置 SSL。参数 {0} 的值无效。扩展代码 51008,

javascript - 使用 vanilla Javascript 将字符串列表发送到 ASP.net api Controller

asp.net - 使用 Asp.Net Identity 2 在 AspNetUserClaims 中存储用户信息有什么好处吗?

c# - 来自 Asp.Net Web Api 异步/任务调用的正确堆栈跟踪