首页 > 解决方案 > Azure 函数(使用 DI)无法删除“/api”路由前缀

问题描述

所以我知道这两个问题似乎在问同样的事情:

如何从 Azure 函数 url 中删除单词“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 方法并不重要,它是导致问题的注册)。也许还有另一种写法?

标签: c#azuredependency-injectionazure-functions

解决方案


所以我似乎犯的错误很小。在以下代码中:

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(IConfigurationRootIConfiguration) 的超集。因此,在注册它时,我丢失了一些东西(可能是配置提供者信息)。

简单地改变:

IConfiguration combinedConfig

IConfigurationRoot combinedConfig

解决问题(或者您可以使用var,我可能应该拥有它!)。

虽然这解决了问题,但我仍然有点困惑,为什么在将routePrefixin更改host.json为一些非空字符串之前有效,但将其设置为空字符串却不行。本来以为简单地在host.jsonat 中设置设置只会应用该值,而没有它意味着恢复到 default "api"


推荐阅读