c# - Azure 函数(使用 DI)无法删除“/api”路由前缀
问题描述
所以我知道这两个问题似乎在问同样的事情:
如何更改 Azure Functions (v2) 上的基本“/api”路径?
但是,我仍然无法摆脱路线中的“api”前缀。
我的host.json
样子:
{
"version": "2.0",
"extensions": {
"http": {
"routePrefix": ""
}
}
}
在我的 HttpTrigger 上,我正在设置我的自定义路由:
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "myapp")] HttpRequest request,
但是,当我在本地运行应用程序时,端点出现如下:
[POST] http://localhost:7071/api/myapp
如果我将我的更改host.json
为:
{
"version": "2.0",
"extensions": {
"http": {
"routePrefix": "something"
}
}
}
我的应用程序现在正在运行:
[POST] http://localhost:7071/something/myapp
所以看起来给出一个空字符串""
是行不通的。有任何想法吗?(我已经完成了所有常规操作:清理解决方案、删除 bin/obj 文件夹等)
仅供参考,我正在使用我的函数应用程序:
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.7" />
编辑:
我还从函数应用程序中引用了这些包(虽然我不明白这会如何导致这个问题):
<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.1.1" />
编辑 2
我已将问题缩小到调用的这段代码Startup.cs
:
IConfiguration configuration = builder.Services.BuildServiceProvider().GetService<IConfiguration>();
IConfiguration combinedConfig = new ConfigurationBuilder()
.AddConfiguration(configuration)
.AddAzureKeyVault(kvEndpoint, kvClient, new DefaultKeyVaultSecretManager());
.Build();
builder.Services.AddSingleton(combinedConfig);
// <-- this line causes the prefix "" to revert to "/api"
它本质上是将密钥库作为配置提供程序添加到所有准备就绪的提供程序堆栈中。(请注意,我在配置生成器上调用的 .Add 方法并不重要,它是导致问题的注册)。也许还有另一种写法?
解决方案
所以我似乎犯的错误很小。在以下代码中:
IConfiguration configuration = builder.Services.BuildServiceProvider().GetService<IConfiguration>();
IConfiguration combinedConfig = new ConfigurationBuilder()
.AddConfiguration(configuration)
.AddAzureKeyVault(kvEndpoint, kvClient, new DefaultKeyVaultSecretManager());
.Build();
builder.Services.AddSingleton(combinedConfig);
ConfigurationBuild.Build()
实际上返回 a IConfigurationRoot
,而不是 a IConfiguration
(IConfigurationRoot
是IConfiguration
) 的超集。因此,在注册它时,我丢失了一些东西(可能是配置提供者信息)。
简单地改变:
IConfiguration combinedConfig
至
IConfigurationRoot combinedConfig
解决问题(或者您可以使用var
,我可能应该拥有它!)。
虽然这解决了问题,但我仍然有点困惑,为什么在将routePrefix
in更改host.json
为一些非空字符串之前有效,但将其设置为空字符串却不行。本来以为简单地在host.json
at 中设置设置只会应用该值,而没有它意味着恢复到 default "api"
。
推荐阅读
- asp.net - FindControl 在 Listview Null 异常中不起作用
- python - 查找列表中连续项目的索引
- flutter - 我需要有关如何保存我的应用状态的指南
- python - 在 Anaconda 上安装 xgboost 时遇到问题
- azure - 当设备在未在 IoT Hub 中注册的情况下发送遥测消息时,IoT Hub 的行为是什么?
- perforce - Perforce 命令在特定仓库路径中查找新添加的文件
- django - Django如何注释计数嵌套的forloop查询集字典
- sql-server - 分组和求和,使用非聚合标准来确定字段选择
- r - 如何在 R 中的同一图上绘制元组层?
- bash - 如何从 bash 脚本中将 stdout 和 stderr 重定向到文件?