azure - 如何使用 Azure Functions 命名 API 路由“...admin ...”?
问题描述
我正在将组件从 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 上提到了几处(线程 1和线程 2),但没有人有适当的解决方案来解决这个问题。
一种解决方法是重命名路线——这正是我想要避免的。
有没有允许在路由中使用“admin”的解决方案?
解决方案
看起来admin
在路由中是为 azure 函数运行时主机严格保留的。
目前,任何以 开头的路线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
}
然后,您可以向路由添加代理(有关 azure function proxies 的更多信息,请点击此处)。代理存储在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)。
推荐阅读
- asp.net-core - 重新启动 IIS 网站后,Blazor 服务器端应用程序不会重定向到登录页面
- javascript - XPages 在按钮单击时创建一个新文件夹
- c++ - 如何修复错误“表达式必须具有指向对象类型”(多文件项目)?
- java - Spring JPA 数据 - 保存方法不会更新
- nginx - nginx 代理通行证:斜杠,vars 不起作用
- r - 更改 plotly-R 中的图例
- python - “属性错误:列表对象没有较低的属性”是什么意思?Sklearn 工具包(Countvectorizer)
- javascript - Array.forEach 函数覆盖 itsel
- java - 按钮单击时的 Android Studio 推送通知
- assembly - 如何在 GPR 的特定位中设置进位标志而不进行移位/旋转?