Azure Функция (с использованием DI) не может удалить префикс маршрута "/ api" - PullRequest
1 голос
/ 18 июня 2020

Итак, я знаю эти два вопроса, которые, кажется, задают одно и то же:

Как удалить слово 'api' из Azure url-адреса функций

Как изменить базовый путь "/ api" в Azure Functions (v2)?

Однако я все еще не могу избавиться от префикса "api" в моем route.

Мой 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 et c.)

FYI из моего функционального приложения, которое я использую:

<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 я вызываю в построителе конфигурации, это регистрация, которая вызывает проблему). Может быть, есть другой способ написать это?

Ответы [ 2 ]

3 голосов
/ 18 июня 2020

Так что ошибка, которую я, кажется, сделал, была очень маленькой. В следующем коде:

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() фактически возвращает IConfigurationRoot, а НЕ IConfiguration (IConfigurationRoot является расширенным набором IConfiguration). Поэтому при регистрации я что-то терял (вероятно, информацию о поставщике конфигурации).

Простая замена:

IConfiguration combinedConfig

на

IConfigurationRoot combinedConfig

устраняет проблему (или вы можете используйте var, который мне, вероятно, следовало бы иметь!).

Хотя это решает проблему, я все еще немного смущен, почему перед изменением routePrefix в host.json на некоторую непустую строку работает, но установка это к пустой строке нет. Можно было бы подумать, что если просто установить параметр в host.json, это просто применит значение, а отсутствие его там будет означать возврат к значению по умолчанию "api".

0 голосов
/ 18 июня 2020

Я пробовал, и он работает!

Я использовал VS2019, создал проект по умолчанию Azure с HTTP-триггером и удалил префикс маршрута из host.json

enter image description here

Файл проекта

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <AzureFunctionsVersion>v2</AzureFunctionsVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.31" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
</Project>

После обновления пакетов nuget до последней версии он работает.

enter image description here

Файл проекта

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <AzureFunctionsVersion>v2</AzureFunctionsVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.2.5" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Core" Version="3.0.16" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Http" Version="3.0.2" />
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.7" />
    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
</Project>
...