Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为什么我的Azure Functions项目无法识别Microsoft.AspNetCore.Http程序集中的类?_.net_Azure_Asp.net Core_Azure Functions - Fatal编程技术网

.net 为什么我的Azure Functions项目无法识别Microsoft.AspNetCore.Http程序集中的类?

.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

我有一个Azure功能项目,目标是netcoreapp3.1。该项目引用另一个类库项目(也针对
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.Internal.FormFile类,该类在.NET Core 3.0及更高版本中不可用。(它移动到了
    Microsoft.AspNetCore.Http.FormFile

  • NET核心3.0引入了共享框架的概念。这是由实现的,它使大量的
    Microsoft.AspNetCore.*
    nuget包冗余。(但不是全部)

    要解决此问题:

  • 我从类库的项目文件中删除了此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;