7

所以我一直在尝试创建一个简单的天蓝色函数,这将是一个 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,并且函数“运行”很好......直到我使用 Postman 向它发送一个 http 请求,这带来了一个关于 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

4 回答 4

6

出于某种原因,必须使用 .NET Standard 2.0 而不是我之前使用的 .NET 461,以及教程建议。

似乎当您创建 azure function initial 时,您的函数是 .NET 461,出于某种原因,您将其更改为 .NET Standard 2.0。

但是,当您的函数是 .NET Standard 2.0 时,您的运行时版本应设置为 beta

所以添加AzureFunctionsVersion你的 .csproj,因为默认的.NET 461 运行时是 1,当你更改为 .NET core 时,你需要手动将运行时更改为“ beta ”。

您可以参考以下代码:

<PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <AzureFunctionsVersion>v2</AzureFunctionsVersion>
  </PropertyGroup>
于 2018-04-12T07:47:26.720 回答
0

我在 VS 2019 上创建新的 Azure Function V2 时遇到了这个问题,并且我包含了函数应用程序引用的另一个项目。删除另一个项目为我修复了它。

于 2020-01-29T16:36:14.740 回答
0

现在是 2020 年,我在 vs 2019 中创建了我的 Azure Functions v1 并得到了同样的错误。但是,我通过编辑 .csproj 文件找到了解决方法,如下所示:

    <AzureFunctionsVersion>v2</AzureFunctionsVersion>
于 2020-06-23T14:11:56.767 回答
0

我刚刚'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}"

超级容易修复,但令人讨厌的部分是它没有遇到任何断点,这使得精确定位有点困难。这就是我发布此内容的原因,以帮助人们在故障排除期间检查此类基本内容:-)

于 2022-02-28T13:09:53.690 回答