为什么我的 Azure Functions 项目无法识别来自 Microsoft.AspNetCore.Http 程序集



我有一个针对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]

所以我的问题的根本原因是双重的:

  1. 我的类库项目引用了 nuget 包Microsoft.AspNetCore.Http。此程序包与 .NET Core 3.0 及更高版本不兼容。

  2. 我的代码使用的是类Microsoft.AspNetCore.Http.Internal.FormFile,该类在 .NET Core 3.0 及更高版本中不可用。(它搬到了Microsoft.AspNetCore.Http.FormFile(

ASP.NET Core 3.0引入了共享框架的概念。这是由Microsoft.AspNetCore.App元包实现的,该元包使大量Microsoft.AspNetCore.*nuget 包变得多余。(但不是全部(

要解决此问题,请执行以下操作:

  1. 我从类库的项目文件中删除了这个 nuget 包引用:

    <PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" />
    

    并将其替换为以下框架参考:

    <FrameworkReference Include="Microsoft.AspNetCore.App" />
    
  2. 在我使用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
};
};

希望对你有帮助 🤞🏼

最新更新