FunctionsStartup与IWebJobsStartup,读取请求上的HttpHeaders时出现问题
c#
我正在本地构建 .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;
}
该GetAzureADConfiguration功能正在执行,GetJwtFromHeader是不是。似乎任何试图通过代码访问 Header 字典的函数都无法进入并导致我的错误。但是,如果我检查监视窗口中的对象,我会看到正确的值。
这是我的 WebJobStartUp 代码:
[assembly: WebJobsStartup(typeof(StartUp))]
namespace CriticalPath.Api.Functions
{
class StartUp : IWebJobsStartup
{
public void Configure(IWebJobsBuilder builder)
{
...
}
}
}
这是我用 FunctionsStartup 尝试过的
[assembly: FunctionsStartup(typeof(Startup))]
namespace CriticalPath.Api.Functions
{
class StartUp : FunctionsStartup
{
public void Configure(IWebJobsBuilder builder)
{
...
}
}
}
为什么我不能单步执行引用请求标头的代码?是什么区别FunctionsStartup和IWebJobsStartup。如果我想使用,如何访问标头IWebJobsStartup?
回答
我能够解决这个问题。这是逐个打击:我的问题围绕着尝试导入类库而不是使用与我的 Azure Functions 应用程序冲突的依赖项。我是如何发现的:我创建了一个全新的 Azure Functions v3 项目和 .NET Core 3.1 库。在对它进行了一些试验后,我发现在我的 Startup 类中从 FunctionsStartup(而不是 WebJobStartup)继承时,我能够成功导入一个空项目。在我的函数中,我添加了访问 req.Headers 字典中条目的代码,这样我就可以看到运行函数失败的时间。一旦我让一个空项目工作,我就查看了一个没有正确导入的项目,并在非工作项目中将引用一一添加到我的空项目中。对于每个参考,我测试了我的 Azure 函数,看看是什么破坏了它。当我来到微软。Extensions.Configuration v5.0,我的功能坏了。我将此依赖项降级到 v3.1.13 并且该功能有效。因此,在不起作用的项目中,我使用 Configuration 来访问我的机密中的变量,一定是版本不匹配。解决这个问题。然后我想创建一个自定义属性。我切换到使用 WebJobStartup 并且网络触发器起作用了。