如何在 .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#递归方法实现无限级分类显示效果实例

    下面是我对于“C#递归方法实现无限级分类显示效果实例”的完整攻略。首先,我们需要明确以下几点: 无限级分类是指,商品分类、地区、部门等数据按照父子关系无限嵌套的数据结构。 递归是指,在函数中调用函数本身的行为。 在使用递归实现无限级分类时,需要注意防止出现“死循环”。 接下来,我们按照以下步骤来实现无限级分类显示效果: 创建商品分类实体类,包含分类ID、分类…

    C# 2023年6月1日
    00
  • C#中JavaScriptSerializer帮助类用法实例

    C#中的JavaScriptSerializer帮助类用于将.NET对象序列化为JSON格式字符串,或将JSON格式字符串反序列化为.NET对象。以下是使用JavaScriptSerializer帮助类的完整攻略。 步骤1:添加JavaScriptSerializer命名空间 首先,我们需要添加JavaScriptSerializer命名空间。使用方法是在.…

    C# 2023年5月31日
    00
  • C#动态绘制多条曲线的方法

    下面是详细讲解C#动态绘制多条曲线的方法的完整攻略。 标题 C#动态绘制多条曲线的方法 步骤 1. 准备工作 首先,我们需要在项目中添加Windows.Form控件和Chart控件。同时,需要引用System.Windows.Forms.DataVisualization库。 using System.Windows.Forms.DataVisualizat…

    C# 2023年6月1日
    00
  • C# 操作Excel代码总结

    下面就为您详细讲解“C# 操作Excel代码总结”的完整攻略。 一、前言 在日常开发中,Excel 是我们经常应用的工具。在 C# 中,操作 Excel 也是一个常见的需求。本文就通过两个示例,来总结一下 C# 中操作 Excel 的代码实现过程。 二、基本环境 在操作 Excel 的过程中,我们需要引入以下命名空间: using Microsoft.Off…

    C# 2023年6月7日
    00
  • .NET 6开发TodoList应用实现结构搭建

    下面是详细讲解“.NET 6开发TodoList应用实现结构搭建”的完整攻略。 1. 概述 在本教程中,我们将使用.NET 6和C#构建一个简单的ToDoList应用程序。这个应用程序将包括一个基本的用户界面,允许用户创建、修改和删除待办任务。 我们将使用ASP.NET Core MVC框架来构建TodoList应用程序,并将其连接到一个SQLite数据库。…

    C# 2023年6月3日
    00
  • C#内存管理CLR深入讲解(上篇)

    C#内存管理CLR深入讲解(上篇) 概述 本文主要介绍C#中的CLR内存管理机制,包括垃圾回收机制、对象生命周期、Finalizer和托管堆等。C#作为一门托管语言,由CLR负责管理内存,以确保程序的稳定性和性能。 垃圾回收 垃圾回收机制是CLR的核心功能之一,它通过监控对象的使用情况,自动清理无用的对象,回收内存资源。在C#中,开发者无需手动管理内存,而是…

    C# 2023年5月31日
    00
  • C#实现的海盗分金算法实例

    C#实现的海盗分金算法实例,是一种常见的分配问题解决方法,以下是详细的攻略过程: 什么是海盗分金算法? 海盗分金算法,也称为“海盗分赃金问题”,是一种常见的分配问题解决方法。故事背景是这样的:若干个海盗合作得到了一批金子,他们需要分配这批金子。其中,每个海盗都可以提出一个分配方案(包括他自己分到多少金子),其他人可以赞成或反对。如果超过一半的海盗同意,那么分…

    C# 2023年6月7日
    00
  • .NET中创建对象的几种方式和对比

    一、.NET中创建对象的几种方式 .NET中创建对象的方式有以下几种: 使用new操作符创建对象 使用Activator.CreateInstance方法创建对象 使用反射及ConstructorInfo类创建对象 使用Object类的MemberwiseClone()方法创建对象 使用FormatterServices.GetUninitializedOb…

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