如何在 .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/p/17316146.html

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

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

相关文章

  • C#实现DVD借出归还管理系统

    C#实现DVD借出归还管理系统攻略 1. 设计系统结构 在设计实现DVD借出归还管理系统之前,我们首先需要确定系统的结构。一般地,可以将其划分为以下主要模块: 用户管理模块 DVD管理模块 借出归还模块 统计报表模块 2. 确定系统功能 在确定系统结构之后,我们需要确定系统的主要功能。一般地,DVD借出归还管理系统的主要功能包括: 添加、删除、修改DVD信息…

    C# 2023年6月1日
    00
  • jsp和asp.net共享session值示例代码

    当用户使用JSP应用程序访问ASP.NET应用程序时,需要在这两个应用程序之间共享sessions,这可以用以下两种方法实现:使用相同的session ID,使用数据库来持久化sessions。 下面是使用相同的session ID来共享跨平台sessions的示例代码: 首先,要在相应的服务器端设置session ID的cookie为Java Servle…

    C# 2023年5月31日
    00
  • DirectoryEntry配置IIS7出现ADSI Error:未知错误(0x80005000)

    问题描述: 在IIS7上配置使用DirectoryEntry连接LDAP时,可能会遇到ADSIError错误,具体表现为:”DirectoryEntry Configuration IIS7 ADSIError:未知错误(0x80005000)”。 解决方案: 确定LDAP连接使用的用户名和密码是否正确。使用错误的用户名或密码会导致连接失败。 确定连接字符串…

    C# 2023年5月15日
    00
  • ASP.NET Core读取配置文件

    ASP.NET Core 读取配置文件是一种非常常见的操作,可以用于配置应用程序的行为。以下是 ASP.NET Core 基础之读取配置文件的完整攻略: 步骤一:创建 ASP.NET Core 应用程序 首先,需要一个 ASP.NET Core 应用程序。可以使用以下命令在 Visual Studio 中创建一个 ASP.NET Core 应用程序: 打开 …

    C# 2023年5月17日
    00
  • C# MeasureString测量字符串函数的使用方法

    下面是详细讲解 “C# MeasureString 测量字符串函数的使用方法”的攻略。 什么是 MeasureString 函数 MeasureString 函数是 C# 中 System.Drawing.Graphics 类中的一个方法,用于测量字符串的尺寸大小。它的方法声明如下: public SizeF MeasureString(string tex…

    C# 2023年6月7日
    00
  • unity里获取text中文字宽度并截断省略的操作

    获取Unity中Text组件中文字宽度并截断省略的操作可以使用Unity自带的TextGenerator类来实现。下面是详细攻略: 步骤1:获取Text组件中的文本字符串 首先,我们需要获取到Text组件中的文本字符串,可以通过Text组件的text属性来获取。例如,如果要获取名为“textObject”的Text组件中的文本字符串,可以使用以下代码: st…

    C# 2023年6月3日
    00
  • C# Linq的Intersect()方法 – 返回两个序列的交集

    C# Linq Intersect()方法详解 Intersect()方法的定义 Intersect()方法是C# Linq方法之一,用于返回两个序列中共同出现的元素。该方法有两个重载版本,一个是无参数版本,返回两个序列中的重复元素,一个是带有另外一个序列作为参数的版本,返回两个序列中相同的元素。 无参数版本 无参数版本的Intersect()方法用于从两个…

    C# 2023年4月19日
    00
  • 浅谈C# 序列化与反序列化几种格式的转换

    下面是 “浅谈C# 序列化与反序列化几种格式的转换” 的完整攻略: 目录 什么是序列化与反序列化 为什么需要序列化与反序列化 C# 中实现序列化与反序列化的几种方式 XML 序列化与反序列化 JSON 序列化与反序列化 Binary 序列化与反序列化 示例说明 XML 序列化与反序列化示例 JSON 序列化与反序列化示例 什么是序列化与反序列化 序列化(Se…

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