Как назвать маршрут API "... admin ..." с помощью функций Azure? - PullRequest
1 голос
/ 01 ноября 2019

Я перемещаю компоненты из веб-служб в функции Azure. Я бы хотел оставить свои конечные точки API без изменений. У меня есть контроллер администратора, который имеет такие конечные точки:

/admin/Heartbeat

Моя соответствующая реализация выглядит следующим образом:

[FunctionName("Heartbeat")]
public static async Task<IActionResult> RunHeartbeat(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "admin/Heartbeat" )] HttpRequest req,
    ILogger log)
{
    ...
}

Если какой-либо из маршрутов начинается с «admin», я получаю этосообщение об ошибке:

Указанный маршрут конфликтует с одним или несколькими встроенными маршрутами.

Нет информации об этом встроенном ограничении или я не могу его найти. На GitHub есть несколько упоминаний ( поток 1 , поток 2 ), но никто не может найти правильное решение этой проблемы.

Обходной путь - переименоватьroute - именно этого я и хотел бы избежать.

Есть ли какое-либо решение, позволяющее использовать «admin» в маршрутах?

1 Ответ

2 голосов
/ 02 ноября 2019

Похоже, admin в маршрутах зарезервировано строго для хоста времени выполнения функций Azure.

В настоящее время эта проблема возникает у любых маршрутов, начинающихся с admin.

API администратора, предоставляемый функциями host:

GET https://<functionappname>.azurewebsites.net/admin/host/status

Ответ:

{
  "id": "bad1ecf31b47-2137340777",
  "state": "Running",
  "version": "2.0.1.0",
  "versionDetails": "2.0.1.0-beta1 Commit hash: N/A"
}

Подробнее об этом: https://github.com/Azure/azure-functions-host/wiki/Admin-API


Обходной путь

Вы можете изменить имя маршрута на v2/admin/Heartbeat в коде функции.

Пример:

[FunctionName("ExampleAdminRoute")]
public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "v2/admin/Heartbeat")]HttpRequest req, ILogger log)
{
    //your admin function code
}

Затем вы можете добавить прокси к маршруту (подробнее о прокси функции Azure здесь ). Прокси хранятся в proxies.json.

Убедитесь, что этот файл скопирован в выходной каталог сборки, т.е. включен в файл .csproj.

Пример proxies.json:

{
  "$schema": "http://json.schemastore.org/proxies",
  "proxies": {
    "AdminProxy": {
      "matchCondition": {
        "methods": [ "GET" ],
        "route": "/api/admin/Heartbeat"
      },
      "backendUri": "https://localhost/api/v2/admin/Heartbeat"
    }
  }
}

Теперь, когда вы запуститеПриложение функций, вы должны увидеть консольный вывод, например:

Now listening on: http://0.0.0.0:7071
Application started. Press Ctrl+C to shut down.
Listening on http://0.0.0.0:7071/
Hit CTRL-C to exit...

Http Functions:

    AdminProxy: http://localhost:7071/api/admin/Heartbeat

    ExampleAdminRoute: http://localhost:7071/api/v2/admin/Heartbeat

Все запросы, поступающие на api/admin/Heartbeat, будут автоматически перенаправлены на api/v2/admin/Heartbeat.

Прокси достаточно гибкие, чтобы поддерживать различные запросы (GET / POST) с параметрами и т. Д.

...