.net 为什么我的Azure Functions项目无法识别Microsoft.AspNetCore.Http程序集中的类?
我有一个Azure功能项目,目标是netcoreapp3.1。该项目引用另一个类库项目(也针对.net 为什么我的Azure Functions项目无法识别Microsoft.AspNetCore.Http程序集中的类?,.net,azure,asp.net-core,azure-functions,.net,Azure,Asp.net Core,Azure Functions,我有一个Azure功能项目,目标是netcoreapp3.1。该项目引用另一个类库项目(也针对netcoreapp3.1),该项目使用程序集中的FormFile类 类库项目成功编译并测试了代码,但当我运行Azure Functions项目时,出现以下异常: System.TypeLoadException:无法从程序集“Microsoft.AspNetCore.Http,版本=3.1.4.0,区域性=中性,PublicKeyToken=adb9793829ddae60”加载类型“Microsof
netcoreapp3.1
),该项目使用程序集中的FormFile
类
类库项目成功编译并测试了代码,但当我运行Azure Functions项目时,出现以下异常:
System.TypeLoadException:无法从程序集“Microsoft.AspNetCore.Http,版本=3.1.4.0,区域性=中性,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>
如果我可以问你为什么在Azure函数上使用FormFile 我建议您基本上使用Azure函数和Blob触发器,而不是HttpTrigger。然后在Blob触发器上以
Stream
的形式获取文件
如果您正在编写API(或者出于某种原因特别需要HttpTrigger),可以使用HttpTrigger通过HttpRequestMessage
获取文件。您可以创建MultipartMemoryStreamProvider
并作为多部分读取(如HTML表单中的enctype=multipart/form数据)和读取为字节数组或任何您想要处理的内容
请在下面查找示例代码块:
[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
};
};
希望有帮助所以我的问题有两个根本原因:
Microsoft.AspNetCore.Http
nuget包。此软件包与.NET Core 3.0及以上版本不兼容Microsoft.AspNetCore.Http.FormFile
)Microsoft.AspNetCore.*
nuget包冗余。(但不是全部)
要解决此问题:
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" />
要使用此语句,请执行以下操作:
using Microsoft.AspNetCore.Http.Internal;
using Microsoft.AspNetCore.Http;
通过在类库项目中将
Microsoft.AspNetCore.Http
上的包引用替换为
修复了此问题。除非有人想抢先一步,否则我会在当天晚些时候公布答案:)谢谢@mehmet taha meral。这并不能回答我的问题。该文件与函数的触发器无关。请考虑<代码>文件信息> /代码>作为函数内部的要求。问题是类库项目使用的是.net core 2.1 DLL(Microsoft.AspNetCore.Http
),而azure函数项目的目标是.net core 3.1。
<FrameworkReference Include="Microsoft.AspNetCore.App" />
using Microsoft.AspNetCore.Http.Internal;
using Microsoft.AspNetCore.Http;