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

时间:2019-05-04 06:45:17

标签: azure azure-functions

我已经定义了4种尝试将regex路由用于我的azure函数的方法,但都无效。

我做错了什么?

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并具有以下匹配: $"~* ^/(subscriptions/[^/]+/)?(resourcegroups/[^/]+/)?providers/(Storage.IO)" 试图在我的azure函数上做同样的事情。

1 个答案:

答案 0 :(得分:0)

好的,我想现在可以为您提供一些帮助。要点是,您不应在此处使用正则表达式。您应该在这里使用route parameters。根据{{​​3}},您应该能够使用与Web API完全相同的语法。

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

  

它将与/ 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}");
        }

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