Azure 函数 http 触发器找不到 Microsoft.Extensions.Primitives.StringValues

问题描述

我正在构建一个带有 http 触发器的 Azure Functions v3 .NET Core 3.1 应用程序。我创建了从请求的 Authorization 标头中检索 jwt 并使用 JwtSecurityTokenHandler 对其进行验证的函数。如果我创建一个继承自 Functionsstartup 的启动类,这会起作用。但是,如果我从 WebJobStartup 继承,则会遇到错误。该应用程序找不到 Microsoft.Extensions.Primitives.StringValues Microsoft.AspNetCore.Http.IHeaderDictionary.get_Item。我可以单步执行代码,但任何尝试访问 request.Headers 字典中条目的函数都不会执行并产生错误(下面的屏幕截图)。

Error accessing Authorization Headers on the Request

这是代码。如果存在 GetJwtFromHeader 引用,调试器将不会进入 req.Headers 函数

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

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;
}

调试器永远不会进入GetJwtFromHeader 函数。如果我删除对 req.Headers 的引用,那么调试器将进入它。似乎任何试图通过代码访问 Header 字典的函数都找不到它。但是,如果我检查监视窗口中的对象,我会看到正确的值。

这可能是我的包中的版本控制问题吗?我尝试安装不同版本的 Microsof.Extensions.Primitives,但在降级到低于 5.0 的任何版本时遇到问题。为什么我在使用 Header 字典时遇到问题?

解决方法

我想出了问题。在我导入的一个项目中,我使用 Microsoft.Extensions.Configuration 从我的机密中读取条目,并且由于某种原因,5.0.0 版本在我的 Azure 函数项目中表现不佳。我将其降级到 3.1.13 并且有效。