如何在 .NET Core WebApi 中处理 MultipartFormDataContent 中的文件

在上一篇文章(如何在 .NET Core WebApi 中处理 MultipartFormDataContent)中,我们有描述过如何以最简单的方式在 .NET Core WebApi 中处理 MultipartFormDataContent 。基于框架层面的封装,我们可以快速的从 Request.Form 中分别拿到文件内容和文本内容,但是这些默认的解析方式都是建立在前后端以标准的数据格式来进行构建和解析。

问题描述

如何在 .NET Core WebApi 中处理 MultipartFormDataContent 中的文件

上图示例展示了用户通过 IOS 客户端发送请求时,对应后端接口接收到的 Request 内容。从请求内容的整体结果,我们可以看出这是一个 multipart/form-data 的数据格式,由于这种数据是由多个 multipart section 组成,所以我们可以看出在这个请求体中,是包含3个 section ,name 值分别为 Agree,CultureCode,FingerSignature,每个 section 都会包含一个 Content-Disposition 字段,前面两个 section都是普通的数据格式,最后一个是图片类型的数据。当后端接口接收到这样一个请求体时,尝试使用 Request.Form.Files 的方式来获取目标文件时,发现无法获取 FingerSignature 对应的文件内容。

问题分析

通过和客户沟通,了解到FingerSignature 对应的文件是会被一起放到请求体中传给后端,客户表示前端APP这一块的逻辑在后端还没有升级成 ASP.NET Core(处于 Framework 阶段)的时候是可以正常工作的。通过查看ASP.NET Core 中对 Request.Form 的赋值逻辑: FormFeature 实现,找到了如下逻辑函数:

如何在 .NET Core WebApi 中处理 MultipartFormDataContent 中的文件

通过源码的逻辑,我们可以看出,只有当前的 section 对应的 Content-Disposition 同时包含 form-data 和 fileName (或 fileNameStar),才会被作为文件来处理(示例:form-data; name="FingerSignature"; fileName=”xxxx.jpeg”),否则并不会把当起的 Section 添加到 Request.Form.Files 中。此时结合上面获取的请求内容,定位到 FingerSignature 部分的 Content-Disposition 中由于缺少 fileName 字段导致后端无法解析到对应文件为该issue 的 Root Cause。

解决方案

由于前端 APP 已经发布多个版本,所以让前端来补全这个字段显然不是一种稳妥的修复方案,因此后端需要做一个兼容性处理。当遇到这种不是标准格式的文件内容,需要通过 MultipartReader 对象来处理 MultipartFormDataContent 对应的 Section 内容(实际上 Request.Form.Files 底层逻辑就是通过 MultipartReader 来依次解析每个 Section 内容)。这里实现了一个方法来获取当前 MultipartFormDataContent 中的所有文件:

如何在 .NET Core WebApi 中处理 MultipartFormDataContent 中的文件

在这个方法中有2个细节地方需要注意。

  • 默认情况下,Request.Body 中的内容只允许读取一次,所以我们需要在使用这个方法的路由地方启用 EnableBuffering 设置,这里可以自定义一个 Filter 来复用这种特性:

如何在 .NET Core WebApi 中处理 MultipartFormDataContent 中的文件

  • 因为对 Request.Body开启 EnableBuffering 了,所以在调用 ReadFilesAsyns 方法的时候,不确定此时 Body 中的 Stream起始位置为 0。所以我们需要在读取 Body 之前和之后通过 Seek 方法将 Stream的 Position 重置归 0。

优化建议

从目前的修复方案来讲的话,后端只是提供了一种妥协的修复方案来适配前端的数据不完整,因此感觉比较完善的修复方案是前端在发送 multipart/form-data 的数据时,尽量以标准的方式来构建每个 Section 内容,尤其是文件类型。如果前后端都能以统一的数据格式来进行交互,自然也就不会出现上述所说的这种问题,潜在的风险自然也就变小了。

原文链接:https://www.cnblogs.com/hippieZhou/archive/2023/04/21/17316146.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何在 .NET Core WebApi 中处理 MultipartFormDataContent 中的文件 - Python技术站

(0)
上一篇 2023年4月22日
下一篇 2023年4月22日

相关文章

  • Asp.net把图片存入数据库和读取图片的方法

    首先,我们需要了解一下在Asp.net中,将图片存入数据库的方法。 将图片存入数据库 在Asp.net中,可以使用二进制对图片进行编码,然后将编码后的二进制数据存入数据库。具体步骤如下: 1.创建数据库表 首先我们需要创建一个用于存储图片的表,例如:PictureTable。表中需要包含两个列:图片名称(PictureName)和图片内容(PictureCo…

    C# 2023年5月31日
    00
  • 基于C#实现宿舍管理系统

    基于C#实现宿舍管理系统攻略 一、项目概述 宿舍管理系统是一款致力于方便学生和宿管管理宿舍日常事务的软件。本项目基于C#语言开发,使用Visual Studio集成开发环境,采用MVC架构,使用SQL Server数据库,提供了较为完整的宿舍管理功能。 二、项目特点 支持多用户登录、身份验证、权限管理等功能,保证系统安全性。 提供完善的宿舍信息录入、查询、修…

    C# 2023年5月31日
    00
  • C# 使用HttpClient模拟请求的案例

    我可以为您详细讲解“C# 使用HttpClient模拟请求的案例”的完整攻略。下面是具体的步骤: 1、安装HttpClient库 在C#中,使用HttpClient需要安装相应的库文件,可以使用NuGet包管理器来安装。具体操作如下: 打开Visual Studio。 在解决方案资源管理器中右键单击项目,然后选择管理NuGet程序包。 在NuGet程序包管理…

    C# 2023年5月31日
    00
  • 浅谈C#中的string驻留池

    下面是详细讲解C#中的string驻留池的完整攻略: 什么是字符串驻留池 字符串是C#语言中最常用的数据类型之一。为了避免构造新的字符串对象导致大量的内存和GC(垃圾回收)压力,C#中引入了字符串驻留池(string intern pool)的概念,用于缓存小字符串对象。驻留池的原理是:当构造了一个字符串对象,并把它赋给一个变量时,.NET运行时会首先检查驻…

    C# 2023年5月31日
    00
  • c# 日历控件的实现

    C#日历控件的实现 在C#中,开发者可以使用日历控件来方便地选择日期。下面分享一下如何在C#中实现日历控件。 步骤一:引用命名空间 首先,在你的C#程序中引用 System.Windows.Forms 命名空间。 using System.Windows.Forms; 步骤二:创建日历控件 在你的C#程序中,实例化一个 MonthCalendar 控件。 M…

    C# 2023年6月1日
    00
  • .NET Core源码解析配置文件及依赖注入

    .NET Core源码解析配置文件及依赖注入 在本攻略中,我们将详细讲解.NET Core源码解析配置文件及依赖注入的技术及工作原理,并提供两个示例说明。 配置文件 .NET Core中的配置文件是一种用于存储应用程序配置信息的文件。配置文件可以包含应用程序的各种配置信息,如数据库连接字符串、日志级别、缓存设置等。在.NET Core中,配置文件通常使用JS…

    C# 2023年5月16日
    00
  • Asp.Net Core 调用第三方Open API查询物流数据的示例

    下面我为您详细讲解 “Asp.Net Core 调用第三方Open API查询物流数据的示例”的完整攻略。 1. 确认使用的 Open API 接口文档 首先,我们需要确认要使用的 Open API 接口文档,以及该文档所提供的查询物流数据的接口信息,包括请求参数和响应数据格式等。通常情况下,我们需要先向物流公司或第三方物流数据服务提供商申请 API 接口权…

    C# 2023年6月3日
    00
  • ASP.NET Core中的Ocelot网关介绍

    ASP.NET Core中的Ocelot网关介绍 Ocelot是一个基于.NET Core的API网关,可以用于将多个微服务组合成一个整体的API。本文将介绍如何在ASP.NET Core中使用Ocelot网关。 准备工作 在开始之前,需要完成以下准备工作: 安装.NET Core SDK。 创建多个微服务。 步骤 步骤1:创建ASP.NET Core We…

    C# 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部