Функции Azure - не могут быть вызваны из Azure WebJobs SDK

Поэтому я пытался создать простую функцию Azure, которая была бы http-триггером "CreateUser".
Я сделал другой триггер http, чтобы упростить то, что не так, это выглядит довольно просто:

using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;

namespace TutoTableAzureTemplate
{
    public static class TestTrigger
    {
        [FunctionName("TestTrigger")]
        public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route =  null)]HttpRequestMessage req, TraceWriter log)
        {
            return req.CreateResponse(HttpStatusCode.OK, "This request arrived succcesfully");
        }
    }
}

Это, работая на эмуляторе, приносит мне следующую ошибку:

Error indexing method 'TestTrigger.Run'. Microsoft.Azure.WebJobs.Host: Cannot bind parameter 'log' to type TraceWriter. Make sure the parameter Type is supported by the binding.

(Версия моего эмулятора 5.3)
Я пытался удалить параметр TraceWriter log, и функция "работает" нормально... пока я не отправлю ей http-запрос с помощью Postman, который выдает ошибку о WebJobs:

"System.InvalidOperationException : 'TestTrigger' can't be invoked from Azure WebJobs SDK. Is it missing Azure WebJobs SDK attributes? ... "

Мне интересно, если атрибут TraceWriter log это вызвало предыдущую проблему, и если есть способ вернуть ее сюда...

Да, и между прочим, я вступил в какие-то конфликты версий ада, и по какой-то причине мне пришлось пойти с.NET Standard 2.0 вместо.NET 461, который я ранее использовал, по предложению учебника.
Вот мой.csproj:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>    
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.13" />
    <PackageReference Include="Microsoft.Azure.Storage.Common" Version="9.0.0.1-preview" />
    <PackageReference Include="Microsoft.Azure.CosmosDB.Table" Version="1.1.1" />
  </ItemGroup>
  <ItemGroup>
    <Reference Include="Microsoft.CSharp" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>
</Project>

"Microsoft.Azure.CosmosDB.Table" по-видимому, недоступно в.NET Standard 2.0, и здесь обновлена ​​версия.NET 461, но "это всего лишь предупреждение"... и "Microsoft.Azure.Storage.Common" только на предварительный просмотр.

Это, вероятно, связано с какой-то версией чего-то, но я потерял себя в уроках, в которых использовались разные вещи, и, поскольку я довольно новичок в Azure, я не знаю, что происходит...

4 ответа

Решение

по какой-то причине пришлось пойти с.NET Standard 2.0 вместо.NET 461, который я ранее использовал, в соответствии с предложением учебника.

Кажется, что когда вы создаете начальную функцию Azure, ваша функция.NET 461 и по какой-то причине вы меняете ее на.NET Standard 2.0.

Однако, когда ваша функция.NET Standard 2.0, ваша версия времени выполнения должна быть установлена ​​на бета-версию.

Так добавь AzureFunctionsVersion в вашем.csproj, поскольку по умолчанию среда выполнения.NET 461 равна 1, а когда вы переходите на ядро ​​.NET, вам нужно вручную изменить среду выполнения на "бета".

Вы можете сослаться на следующий код:

<PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <AzureFunctionsVersion>v2</AzureFunctionsVersion>
  </PropertyGroup>

у меня было то же самое 'TestTrigger' can't be invoked from Azure WebJobs SDK. Is it missing Azure WebJobs SDK attributes?"- ошибка в v4работающая функция .Net 6.0.

В моем случае это было так же просто, как плохой маршрут, например:

      public async Task<Models.BinaryFile> GetAsync([HttpTrigger(AuthorizationLevel.Function, "get",
 Route = BaseUrl")] HttpRequest req, Guid fileId, ILogger log)
    {
        // [logic to get file here...]
        return file;
    }

Должно было быть так:

      public async Task<Models.BinaryFile> GetAsync([HttpTrigger(AuthorizationLevel.Function, "get",
 Route = BaseUrl + "/{fileId}")] HttpRequest req, Guid fileId, ILogger log)
    {
        // [logic to get file here...]
        return file;
    }

Обратите внимание на эту часть: Route = BaseUrl + "/{fileId}".

Очень простое исправление, но раздражает то, что оно не сработало ни одной точки останова, что немного затрудняет определение. Вот почему я публикую это, чтобы помочь людям проверить основные вещи, подобные этому, во время устранения неполадок :-)

Сейчас 2020 год, и я создал свои функции Azure v1 в vs 2019 и получил ту же ошибку. Однако я нашел обходной путь, отредактировав файл.csproj следующим образом:

    <AzureFunctionsVersion>v2</AzureFunctionsVersion>

Я столкнулся с этой проблемой при создании новой функции Azure V2 в VS 2019 и включил еще один проект, на который ссылается приложение-функция. Удаление другого проекта исправило это для меня.

Другие вопросы по тегам