我已经为我的 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/