azure - 如何在 Azure Function c# 中使用正则表达式路由

标签 azure azure-functions

我已经为我的 azure 函数定义了 4 次使用正则表达式路由的尝试,但没有一个起作用。

我做错了什么?

public class ServerlessApi
{
    [FunctionName("Proxy")]
    public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, Route = "{test:regex(^\\/(subscriptions\\/[^\\/]+\\/)?(resourcegroups\\/[^\\/]+\\/)?providers\\/(Storage\\.IO))}")]HttpRequest req) => 
        new ProxyActionResult<FunctionHostStartup>();

    [FunctionName("Proxy1")]
    public async Task<IActionResult> Run1([HttpTrigger(AuthorizationLevel.Anonymous, Route = "{test:regex(^/(subscriptions/[^/]+/)?(resourcegroups/[^/]+/)?providers/(Storage\\.IO))}")]HttpRequest req) =>
      new ProxyActionResult<FunctionHostStartup>();

    [FunctionName("Proxy2")]
    public async Task<IActionResult> Run2(
        [HttpTrigger(AuthorizationLevel.Anonymous, Route = "{path:regex(^/providers/Storage\\.IO)}")] HttpRequest req) 
        =>   new ProxyActionResult<FunctionHostStartup>();

    [FunctionName("Proxy3")]
    public async Task<IActionResult> Run3([HttpTrigger(AuthorizationLevel.Anonymous, Route = "{test:regex(^\\/providers\\/(Storage\\.IO))}")]HttpRequest req) =>
 new ProxyActionResult<FunctionHostStartup>();
}

我曾经使用nginx并有以下匹配: $"~* ^/(订阅/[^/]+/)?(资源组/[^/]+/)?providers/(Storage.IO)" 尝试在我的 azure 函数上做同样的事情。

最佳答案

好的,我想现在我可以帮助你一点。要点是您不应该在这里使用正则表达式。您应该在这里使用 route parameters 。根据this您应该能够使用与 Web API 完全相同的语法。

这里的问题是 URL 可能会有所不同,我们需要考虑几种情况。

It will match /subscriptions/{id}/resourcegroups/{id}/providers/{id}

然后这样定义

        [FunctionName("Function1")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = "f1/subscriptions/{subid:int?}/resourcegroups/{resid:int?}/providers/{proid:int?}")] HttpRequest req,
            ILogger log, int? subid, int? resid, int? proid)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            return new OkObjectResult($"Got s {subid}, r {resid}, p {proid}");
        }

当然,您应该使用对您有意义的类型和约束。这个问题的问题在于,您确实应该指定所有参数http://localhost:7071/api/f1/subscriptions/1/resourcegroups/0/providers/4。您将无法像 http://localhost:7071/api/f1/providers/4 那样编写 smt。因此,我会为这种情况和其他所有情况创建一个函数,提取另一个类/方法中的通用逻辑:

        [FunctionName("Function2")]
        public static async Task<IActionResult> Run2(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = "f2/providers/{proid:int?}")] HttpRequest req,
            ILogger log, int? proid)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            return new OkObjectResult($"Got p {proid}");
        }

另一种可能性是使用 wildcard parameter ,将整个路由与变量匹配,然后使用正则表达式对其进行解析。

关于azure - 如何在 Azure Function c# 中使用正则表达式路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55980213/

相关文章:

Azure Databricks 执行失败 - CLOUD_PROVIDER_LAUNCH_FAILURE

c# - .net6.0 上的 Azure Functions 无法在本地运行,并出现 hostpolicy.dll 错误

c# - 使用Azure功能下载文件并将其存储到Azure

Azure Devops - 在模板中使用运行时变量

azure - 将图像添加到 QnA Maker

c# - 尝试读取性能计数器时出现 Azure 自动缩放异常

azure - 减去 ADF 中的 2 天当前日期

Python Azure 函数 - 使用 Key Vault 进行 MSI 身份验证

Azure Functions - 无法加载文件或程序集 '' Microsoft.WindowsAzure.Storage'

azure - 使用 Visual Studio Code 在本地运行和调试 2 Azure 函数