我能够运行具有来自本地以及美国西部2消费计划的eventhub绑定的功能应用程序。从过去4天开始,我们将所有相关项目移至x64中进行构建并将所有nuget更新至最新-函数应用程序开始失败。它甚至没有启动,它无法加载functionsproject.dll本身。即使我将部分部署到消费计划中,也会出现同样的问题。
<PackageReference Include="Microsoft.ApplicationInsights" Version="2.10.0" /> <PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.0.0" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.EventHubs" Version="3.0.6" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="2.2.0" /> <PackageReference Include="Microsoft.Jarvis" Version="20190426.1.0-rc" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.29" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
<PackageReference Include="Polly" Version="7.1.0" />
我无法提取FusionLog。我猜想,Functions框架StartLocator具有自定义逻辑来加载不会填充融合日志的库。
我尝试在FunctionAssemblyLoadContext.cs中调试LoadFromAssemblyPath(string assemblyPath, bool addProbingPath)
,从而引发此异常。我可以看到该程序集bin路径,并验证我的功能应用程序已内置到该文件夹本身中。我什至通过在IlSpy中打开来验证dll的版本和其他详细信息。我无法弄清为什么程序集(功能应用程序dll)按预期方式存在于该路径中时无法加载。
在Github上记录的问题:Link
试用Microsoft.Azure.Webjobs.Extensions.Eventhubs的旧版本,即试用3.0.5版
[FunctionName("WriteToStore")]
public async Task Run([EventHubTrigger("activities", Connection = "EventHubConnectionAppSetting", ConsumerGroup = "%ConsumerGroup%")] EventData[] events,
[EventHub("failed-activities", Connection = "EventHubConnectionAppSetting")]IAsyncCollector<EventData> outputEvents)
{
//Logic here
}
功能控制台的更多详细信息:
Azure函数核心工具(2.7.1505提交哈希:eb8182995562240ca83dd0e0e3394586cf5fdfa3)
函数运行时版本:2.0.12590.0
[8/4/2019 10:09:25 PM]构建主机:抑制启动:False,抑制配置:False
[8/4/2019 10:09:26 PM]发生主机错误
[8/4/2019 10:09:26 PM] System.Private.CoreLib:无法加载文件或程序集'Microsoft..EventHubConsumers,版本= 1.0.0.0,区域性=中性,PublicKeyToken =空'。< / p>
值不能为空。
参数名称:provider
按任意键继续。...[8/4/2019 10:09:27 PM]构建主机:抑制启动:False,抑制配置:False
[2019/8/4下午10:09:27]发生主机错误
[8/4/2019 10:09:27 PM] System.Private.CoreLib:无法加载文件或程序集“ Microsoft..EventHubConsumers,版本= 1.0.0.0,区域性=中性,PublicKeyToken =空”。 / p>
托管环境:生产
内容根路径:D:some \ EventHubConsumers \ bin \ x64 \ Debug \ netcoreapp2.1
现在收听:http://0.0.0.0:7071
应用程序已启动。按Ctrl + C关闭。
[8/4/2019 10:09:29 PM]构建主机:抑制启动:False,抑制配置:False
[2019/8/4下午10:09:29]发生主机错误
[8/4/2019 10:09:29 PM] System.Private.CoreLib:无法加载文件或程序集“ Microsoft.some.EventHubConsumers,版本= 1.0.0.0,区域性=中性,PublicKeyToken =空”。
答案 0 :(得分:1)
解决了几个问题后,我开始工作了。我将记录我遵循的问题和修复。
要重复,我的功能应用程序配置为使用x64构建并在.Netcore 2.1上运行
其中一个从属项目(程序集)是使用netstandard 2.0构建的,而其他所有项目都是使用Netcore 2.1构建的。这引起了x64的程序集加载问题(尽管该依赖程序集是使用x64配置构建的)。这听起来有点不可思议,但我不认为这是首先解决的问题,甚至是问题。
Visual Studio可能运行x86核心工具,因此从Visual Studio(2017年和19日)运行时,x64函数应用会由于程序集加载等原因而失败。您可以将项目设置为在调试时运行外部应用程序。您可以设置“属性”->“调试”以启动“ func.exe主机启动”。
从Visual Studio启动功能应用程序后,出现“值不能为空。参数-路径”异常。
修复-解释(here - Github)。 路径中缺少npm路径。我在PATH环境变量中更新了npm根路径。
我不得不使用“ func host start”更新azure函数核心工具并运行函数app。现在,我使用“ func host start”运行应用程序,并将调试器附加到func.exe(CTRL + ALT + P)。您可以在本地appdata文件夹-%LocalAPPDATA%\AzureFunctionsTools
中找到AzureFunctionTools文件夹。您可以在releases文件夹中看到所有版本的Azure功能核心工具,以及cli和func.exe示例-AzureFunctionsTools\Releases\2.28.0\cli
部署的主要问题是应用程序设置。我必须在Azure门户上将应用程序平台更改为 64位。默认情况下,功能应用是使用32位平台设置创建的。说明here - Github。
Function应用程序没有为融合日志提供程序集加载问题,这使得很难理解出了什么问题!