FunctionsStartup 与 IWebJobsStartup,读取请求上的 HttpHeaders 时出现问题

afr*_*111 1 c# .net-core azure-functions azure-function-app

我正在本地构建 .NET Core 3.1 Azure Functions 应用程序,并尝试配置启动类。当我实现一个要继承的类时,FunctionsStartup我无法将 .net core 3.1 类库导入到我的项目中。如果我这样做并尝试运行该应用程序,我会在执行窗口中收到以下错误:

Microsoft.Azure.Functions.Extensions: Method not found: Microsoft.Extensions.Configuration.IConfigurationBuilder Microsoft.Azure.WebJobs.Hosting.IWebJobsConfigurationBuilder.get_ConfigurationBuilder()'. Value cannot be null. (Parameter 'provider')

当我将 Startup 基类切换到IWebJobsStartup应用程序时,启动正常。当我提出请求并尝试单步执行代码时,我遇到了问题。我可以单步执行代码的初始部分(所以我知道我的请求已成功接收),但我无法单步执行我的其中一个功能。我收到一个下载提示,并在 VS 工作区中打开一个页面,其中包含TaskMethodInvker.cs not found带有标记行的错误消息You need to find TaskMethodInvoker.cs to view the source for the current call stack frame。下面的代码显示了我的功能:

[FunctionName("HttpAuth")]
public async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
    ExecutionContext context,
    ILogger log)
{
    GetAzureADConfiguration(context);
    var jwt = GetJwtFromHeader(req);
}

private JwtSecurityToken GetSecurityToken(string encodedToken)
{
    ...
}

private string GetJwtFromHeader(HttpRequest req)
{
    var authorizationHeader = req.Headers?["Authorization"];
    string[] parts = authorizationHeader?.ToString().Split(null) ?? new string[0];
    return (parts.Length == 2 && parts[0].Equals("Bearer")) ? parts[1] : string.Empty;
}
Run Code Online (Sandbox Code Playgroud)

GetAzureADConfiguration功能正在执行,GetJwtFromHeader是不是。似乎任何试图通过代码访问 Header 字典的函数都无法进入并导致我的错误。但是,如果我检查监视窗口中的对象,我会看到正确的值。

这是我的 WebJobStartUp 代码:

[assembly: WebJobsStartup(typeof(StartUp))]
namespace CriticalPath.Api.Functions
{
    class StartUp : IWebJobsStartup 
    {
        public void Configure(IWebJobsBuilder builder) 
        {
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我用 FunctionsStartup 尝试过的

[assembly: FunctionsStartup(typeof(Startup))]
namespace CriticalPath.Api.Functions
{
    class StartUp : FunctionsStartup
    {
        public void Configure(IWebJobsBuilder builder)
        {
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么我不能单步执行引用请求标头的代码?是什么区别FunctionsStartupIWebJobsStartup。如果我想使用,如何访问标头IWebJobsStartup

afr*_*111 6

我能够解决这个问题。这是逐个打击:我的问题围绕着尝试导入类库而不是使用与我的 Azure Functions 应用程序冲突的依赖项。我是如何发现的:我创建了一个全新的 Azure Functions v3 项目和 .NET Core 3.1 库。在对它进行了一些试验后,我发现在我的 Startup 类中从 FunctionsStartup(而不是 WebJobStartup)继承时,我能够成功导入一个空项目。在我的函数中,我添加了访问 req.Headers 字典中条目的代码,这样我就可以看到运行函数失败的时间。一旦我让一个空项目工作,我就查看了一个没有正确导入的项目,并在非工作项目中将引用一一添加到我的空项目中。对于每个参考,我测试了我的 Azure 函数,看看是什么破坏了它。当我来到微软。Extensions.Configuration v5.0,我的功能坏了。我将此依赖项降级到 v3.1.13 并且该功能有效。因此,在不起作用的项目中,我使用 Configuration 来访问我的机密中的变量,一定是版本不匹配。解决这个问题。然后我想创建一个自定义属性。我切换到使用 WebJobStartup 并且网络触发器起作用了。

  • 对于任何被这个问题踢到这里的人来说:降级是必要的,因为 Microsoft.Extensions.Configuration v5.0.0(NuGet 将提示您使用并且您本能地接受的版本)是针对新的 .NET 5 的,但 .NET Core 3.1 仍会编译它/NuGet 会将其称为您项目的最新版本。**它不是**。这只是一个超级令人困惑的微软错误。 (2认同)