我有一个针对netcoreapp3.1
的 Azure Functions 项目。该项目引用另一个类库项目(也面向netcoreapp3.1
(,该项目使用Microsoft.AspNetCore.Http
程序集中的FormFile
类。
类库项目编译和测试成功运行代码,但在运行 Azure 函数项目时出现以下异常:
System.TypeLoadException:无法从程序集"Microsoft.AspNetCore.Http, Version=3.1.4.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' 加载类型"Microsoft.AspNetCore.Http.Internal.FormFile"。
我的问题是为什么 azure functions 项目无法加载类以及如何解决它?
下面是 Azure 函数项目的项目文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<AzureFunctionsVersion>v3</AzureFunctionsVersion>
<AssemblyName>AzureFunctionsProject</AssemblyName>
<RootNamespace>AzureFunctionsProject</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.0.0" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.SendGrid" Version="3.0.0" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="3.0.3" />
<PackageReference Include="Microsoft.Extensions.Configuration.AzureAppConfiguration" Version="3.0.1" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.7" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..ClassLibraryProject.csproj" />
</ItemGroup>
<ItemGroup>
<None Update="host.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="local.settings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</None>
</ItemGroup>
</Project>
以及类库的项目文件: 类库项目
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<AssemblyName>ClassLibraryProject</AssemblyName>
<RootNamespace>ClassLibraryProject</RootNamespace>
<LangVersion>8.0</LangVersion>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<None Include="...editorconfig" Link=".editorconfig" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Azure.Storage.Blobs" Version="12.4.1" />
<PackageReference Include="Dapper" Version="2.0.35" />
<PackageReference Include="Dapper.Contrib" Version="2.0.35" />
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" />
<PackageReference Include="Microsoft.Azure.ServiceBus" Version="4.1.3" />
<PackageReference Include="Microsoft.Data.SqlClient" Version="1.0.19269.1" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.3" />
</ItemGroup>
</Project>
运行dotnet --list-runtimes
输出:
Microsoft.AspNetCore.All 2.1.7 [C:Program FilesdotnetsharedMicrosoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.1.12 [C:Program FilesdotnetsharedMicrosoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.1.13 [C:Program FilesdotnetsharedMicrosoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.1.19 [C:Program FilesdotnetsharedMicrosoft.AspNetCore.All]
Microsoft.AspNetCore.App 2.1.7 [C:Program FilesdotnetsharedMicrosoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.1.12 [C:Program FilesdotnetsharedMicrosoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.1.13 [C:Program FilesdotnetsharedMicrosoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.1.19 [C:Program FilesdotnetsharedMicrosoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.1.3 [C:Program FilesdotnetsharedMicrosoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.1.5 [C:Program FilesdotnetsharedMicrosoft.AspNetCore.App]
Microsoft.NETCore.App 1.0.5 [C:Program FilesdotnetsharedMicrosoft.NETCore.App]
Microsoft.NETCore.App 1.1.2 [C:Program FilesdotnetsharedMicrosoft.NETCore.App]
Microsoft.NETCore.App 2.0.6 [C:Program FilesdotnetsharedMicrosoft.NETCore.App]
Microsoft.NETCore.App 2.0.9 [C:Program FilesdotnetsharedMicrosoft.NETCore.App]
Microsoft.NETCore.App 2.1.7 [C:Program FilesdotnetsharedMicrosoft.NETCore.App]
Microsoft.NETCore.App 2.1.12 [C:Program FilesdotnetsharedMicrosoft.NETCore.App]
Microsoft.NETCore.App 2.1.13 [C:Program FilesdotnetsharedMicrosoft.NETCore.App]
Microsoft.NETCore.App 2.1.19 [C:Program FilesdotnetsharedMicrosoft.NETCore.App]
Microsoft.NETCore.App 3.1.3 [C:Program FilesdotnetsharedMicrosoft.NETCore.App]
Microsoft.NETCore.App 3.1.5 [C:Program FilesdotnetsharedMicrosoft.NETCore.App]
Microsoft.WindowsDesktop.App 3.1.3 [C:Program FilesdotnetsharedMicrosoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 3.1.5 [C:Program FilesdotnetsharedMicrosoft.WindowsDesktop.App]
所以我的问题的根本原因是双重的:
-
我的类库项目引用了 nuget 包
Microsoft.AspNetCore.Http
。此程序包与 .NET Core 3.0 及更高版本不兼容。 -
我的代码使用的是类
Microsoft.AspNetCore.Http.Internal.FormFile
,该类在 .NET Core 3.0 及更高版本中不可用。(它搬到了Microsoft.AspNetCore.Http.FormFile
(
ASP.NET Core 3.0引入了共享框架的概念。这是由Microsoft.AspNetCore.App
元包实现的,该元包使大量Microsoft.AspNetCore.*
nuget 包变得多余。(但不是全部(
要解决此问题,请执行以下操作:
-
我从类库的项目文件中删除了这个 nuget 包引用:
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" />
并将其替换为以下框架参考:
<FrameworkReference Include="Microsoft.AspNetCore.App" />
-
在我使用
FormFile
类的文件中,我更改了这个 using 语句:using Microsoft.AspNetCore.Http.Internal;
对于此使用语句:
using Microsoft.AspNetCore.Http;
如果我可以问你为什么在Azure Functions上使用FormFile?
我建议你基本上是将Azure Functions与Blob Trigger一起使用 - 而不是HttpTrigger。你将在 Blob 触发器上获取Stream
文件。
如果你正在编写一个API(或者由于某种原因你特别需要HttpTrigger(,你可以使用HttpTrigger获取文件HttpRequestMessage
。您可以创建MultipartMemoryStreamProvider
并读取为多部分(如 enctype = HTML 表单中的多部分/表单数据(,并读取为字节数组或任何您想要处理的内容。
请在下面找到示例代码块:
[FunctionName(nameof(UploadFile))]
public static async Task UploadFile([HttpTrigger(Constants.AuthorizationLevel.UploadFile,
Constants.HttpVerbs.UploadFile,
Route = Constants.Routes.UploadFile)]HttpRequestMessage req, TraceWriter log)
{
var streamProvider = new MultipartMemoryStreamProvider();
await req.Content.ReadAsMultipartAsync(streamProvider);
var firstFile = streamProvider.Contents.First();
var fileInfo = firstFile.Headers.ContentDisposition;
var fileData = await firstFile.ReadAsByteArrayAsync();
// e.g for image
var img = new Image()
{
FileName = fileInfo.FileName,
Size = fileData.LongLength,
Status = ImageStatus.Processing
};
};
希望对你有帮助 🤞🏼