Как использовать регулярное выражение в Azure Function c # - PullRequest
1 голос
/ 04 мая 2019

Я определил 4 попытки использовать регулярное выражение для моей функции 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 голосов
/ 06 мая 2019

Хорошо, теперь я могу вам немного помочь.Главное, что вы не должны использовать регулярные выражения здесь.Здесь вы должны использовать параметры маршрута .Согласно this вы должны иметь возможность использовать точно такой же синтаксис, что и веб-API.

Проблема в том, что URL-адрес может различаться, и нам нужно рассмотреть несколько случаев.

Это будет соответствовать / subscription / {id} / resourcegroups / {id} / provider / {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.Таким образом, я бы создал функцию для этого и каждого другого случая, извлекая общую логику в некоторый другой класс / метод:

        [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}");
        }

Другая возможность - использовать параметр подстановочного знака , matchвесь маршрут к переменной, а затем проанализируйте его с помощью регулярного выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...