如何使用Azure函数将API路由命名为“ ... admin ...”?

时间:2019-11-01 02:08:04

标签: azure routing azure-functions

我将组件从Web服务转移到Azure Functions。我想保持API端点不变。我有一个管理员控制器,其端点如下:

/admin/Heartbeat

我相应的实现如下:

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

如果任何路由以“ admin”开头,我都会收到此错误消息:

  

指定的路由与一个或多个内置路由冲突。

几乎没有关于此内置限制的信息-否则我找不到它。在GitHub(thread 1thread 2)上有两处提及,但没有人对此问题有适当的解决方案。

一种解决方法是重命名路由-这正是我要避免的方法。

有没有允许在路由中使用“ admin”的解决方案?

1 个答案:

答案 0 :(得分:2)

路由中类似admin的外观严格保留给天蓝色函数运行时主机。

当前,任何以admin开头的路由都存在该问题。

函数主机公开的Admin API:

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
}

然后,您可以将代理添加到路由(有关天蓝色函数代理here的更多信息)。代理存储在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)。