Функции 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 и включил еще один проект, на который ссылается приложение-функция. Удаление другого проекта исправило это для меня.