想说爱你不容易 | 使用最小 WEB API 实现文件上传

前言

在 .NET 6 之前,实现文件上传功能十分简单:

[HttpPost("upload")]
public async Task<IActionResult> Upload(IFormFile file)
{//对file执行操作return Ok(file.FileName);
}

但是,当使用 .NET 6 的最小 WEB API 来实现相同功能时,却意外地遇到了不少坑。

实现代码

转换为最小 WEB API 来实现后,代码是这样的:

app.MapPost("/upload", async (IFormFile file) =>
{return Results.Ok(file.FileName);
});

但是,在使用相同的客户端代码调用时,却返回了 HTTP 415 错误:

090b0c7f3db581095384b760f84ceeca.png

允许 Content Type

这是由于上传文件时,使用的 Content-Type 不是默认的 application/json,而是 multipart/form-data

39f5bbffaf48e68d855f959eb054c99f.png

在 dotnet/aspnetcore 的 issues 中,我们找到了相关解决方案(https://github.com/dotnet/aspnetcore/issues/35082):

060cb7016661b56092dd0894f8d2615e.png

修改代码如下:

app.MapPost("/upload", async (IFormFile file) =>
{return Results.Ok(file.FileName);
}).Accepts<IFormFile>("multipart/form-data");

结果,还是返回了415错误。更奇怪的是,多出来了一堆错误堆栈信息:

aeb3db49c7fd63fd380a8bae3b3e1da0.png

惊现 BUG

于是,想通过查看代码方式找到问题。

使用错误信息“Expected a supported JSON media type but got”,我们定位到了源代码文件 Http/Http.Extensions/src/RequestDelegateFactory.cs:

但是,发现 master 分支和 v6.0.0 分支的代码,差别巨大。比如,master 分支有 IFormFile 相关代码,而 v6.0.0 上完全没有:

5937a6dd39720fd4baf89d4cd82ef8a6.png

查看该文件的提交历史,我们找到了这样一条提交:

d6ab2c4294d071b62fe32608bd85868a.png

根据提交,我们找到了对应的 issue(https://github.com/dotnet/aspnetcore/issues/34303):

9ab765ff465826581505e7c098625488.png

看来,要想支持 IFormFile 参数,我们得等到2022年11月(.NET 7 预计发布日期)!!!

8f88426a451580d590368935c3993d06.png

解决方案

幸好,该 issue 也提供了变通的解决方案,传入 HttpRequest 参数:

app.MapPost("/upload",async (HttpRequest request) =>{var form = await request.ReadFormAsync();return Results.Ok(form.Files.First().FileName);});

验证成功。

结论

后面,我也尝试过在 .NET 6 中用以前的 Controller 方式实现,完全没问题。

看来最小 WEB API 是不同的实现机制,不确定还有不有其他的坑。

建议:最小 WEB API 暂时不要用于生产项目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android下载文件

2019独角兽企业重金招聘Python工程师标准>>> package com.test;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.net.URL;import java.net.URLConnection;import android.app.Activity;import android.content.Intent…

C++之operator关键字(重载操作符) 使用总结

operator是C++的关键字,它和运算符一起使用,表示一个运算符函数, 一、为什么使用操作符重载 简单的说我们基本数据比如int float 都可以比较大小 有>、<、=,但是对象需要比较大小怎么办,我们也可以用>、<、=,只不过我们需要一个通用的规范比较对象的属性…

#HTTP协议学习# (七)cookie

本文转自&#xff1a;http://www.cnblogs.com/TankXiao/archive/2012/12/12/2794160.html Cookie是HTTP协议中非常重要的东西&#xff0c; 之前拜读了Fish Li 写的【细说Cookie】&#xff0c; 让我学到了很多东西。Fish的这篇文章写得太经典了。 所以我这篇文章就没有太多内容了…

C#中的类型~存储~变量

欢迎您成为我的读者&#xff0c;希望这篇文章能给你一些帮助。前言今天在群里看到朋友讨论把粉丝称为读者&#xff0c;这让我内心特别激动。以前我还是比较关注自己的文章阅读量&#xff0c;有没有人转发&#xff0c;今天新增多少个关注。而现在&#xff0c;我的关注点变了&…

C++之typename

1、typename和class 在模板前,typename和class没有区别 template<typename T> class A; template<class T> class A;typename和class对编译器而言却是不同的东西 2、声明一个类型 看下面的代码 我们编译下结果如下 编译器不知道T::const_iterator是个类型。如果…

mooc数据结构与算法python版期末考试_数据结构与算法Python版-中国大学mooc-试题题目及答案...

数据结构与算法Python版-中国大学mooc-试题题目及答案更多相关问题婴儿出生一两天后就有笑的反应&#xff0c;这种笑的反应属于()。【判断题】填制原始凭证&#xff0c;汉字大写金额数字一律用正楷或草书书写&#xff0c;汉字大写金额数字到元位或角位为止的&#xff0c;后面必…

使用 NetCoreBeauty 优化 .NET CORE 独立部署目录结构

在将一个 .NET CORE \ .NET 5.0 \ .NET 6.0 程序进行独立部署发布时&#xff0c;会在发布目录产生很多系统类库&#xff0c;导致目录非常不简洁。这给寻找入口程序造成了困难&#xff0c;特别是路遥工具箱这种绿色软件&#xff0c;不会在开始菜单、系统桌面创建快捷方式&#x…

ios之最简单的程序

1、构建学生对象并且打印相关信息 代码&#xff1a;#import <UIKit/UIKit.h> #import "AppDelegate.h"interface Student : NSObject //变量 property NSString *name; property int age; property float score;//method -(void)show;endimplementation Studen…

网站前端_EasyUI.基础入门.0009.使用EasyUI Layout组件的最佳姿势?

1. 基础布局<div id"l" class"easyui-layout" data-options"width:500,height:250"><div data-options"region:north,title:north,height:50"></div><div data-options"region:west,title:west,width:100&q…

MySQL数据库如何管理与维护_mysql数据库的管理与维护

mysql数据库的管理与维护云服务器(Elastic Compute Service&#xff0c;简称ECS)是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务。云服务器ECS免去了您采购IT硬件的前期准备&#xff0c;让您像使用水、电、天然气等公共资源一样…

[转载]Javascript异步编程的4种方法

NodeJs的最大特性就是"异步" 目前在NodeJs里实现异步的方法中&#xff0c;使用“回调”是最常见的。 其实还有其他4种实现异步的方法&#xff1a; 在此以做记录 --- http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html --- 你可能知道&am…

继 SpringBoot 3.0,Elasticsearch8.0 官宣:拥抱 Java 17

大家好&#xff0c;我是君哥。新版任你发&#xff0c;我用 Java 8&#xff0c;这可能是当下 Java 开发者的真实写照。不过时代可能真的要抛弃 Java 8&#xff0c;全面拥抱 Java 17 了。Spring Boot 3.0前些天&#xff0c;相信小伙伴们都注意到了&#xff0c;SpringBoot 发布了 …

文件下载

2019独角兽企业重金招聘Python工程师标准>>> public String downloadFile() {try {if (id ! null && !"".equals(id) && !"null".equals(id)) {ResourceFile rf resourceFile.getResourceFile(id);filename new String(rf.ge…

ios之Xcode工程中添加文件常用快捷键

1、Xcode某个工程中添加文件 有两种方式&#xff1a; 方式一&#xff1a;“command”&#xff0b;“n”&#xff0c;弹出添加文件对话框。 方式二&#xff1a;在需要添加文件的工程目录下右键&#xff0c;选择“New File…”。 以上方式Xcode会弹出下面的对话框&#xff1…

想说爱你不容易 | 使用最小 WEB API 实现文件上传(Swagger 支持)

前言上回&#xff0c;我们使用最小 WEB API 实现文件上传功能&#xff08;《想说爱你不容易 | 使用最小 WEB API 实现文件上传》&#xff09;&#xff0c;虽然客户端访问是正常的&#xff0c;但是当打开 Swagger 页面时&#xff0c;发现是这样的&#xff1a;没法使用 Swagger 页…

sql多表查询之一:Where 和 On的秘密

原文 sql多表查询之一&#xff1a;Where 和 On的秘密 对于还在SQL初级阶段的朋友来说&#xff0c;sql多表查询问题是一个比较有趣也容易出错的技术。什么时候会用到sql多表查询呢&#xff1f;是在两张或两张以上表单中通过某几个字段进行互联管理的时候&#xff0c;这就不得不说…

C#中类的override和virtual

欢迎您成为我的读者&#xff0c;希望这篇文章能给你一些帮助。前言昨天和大家一起学习类的派生&#xff0c;知道派生类和基类的区别。今天咱们一起看看派生类和基类的虚方法和覆写方法是如何使用的。我们使用基类引用访问派生类对象时&#xff0c;得到的是基类的成员。当使用虚…

内存中压缩图片

首先该文章是总结, 不是原创, 是通过看网上其他大神的文章和自己的一些实践总结出来的.一.图片的存在形式1.文件形式(即以二进制形式存在于硬盘上)2.流的形式(即以二进制形式存在于内存中)3.Bitmap形式这三种形式的区别: 文件形式和流的形式对图片体积大小并没有影响,也就是说,…

使用C# 探索 ML.NET 中的不同机器学习任务

什么是 ML.NET&#xff1f;ML.NET 是 Microsoft 开源的针对 .NET 应用程序的 跨平台机器学习库&#xff0c;允许您使用 C#、F# 或任何其他 .NET 语言执行机器学习任务。此外&#xff0c;ML.NET 支持在其他机器学习框架中构建的模型&#xff0c;如TensorFlow&#xff0c;ONNX&am…

【JavaWeb学习笔记】15 - jQuery

目录 零、官方文档 一、jQuery基本介绍 1.基本介绍 2.原理图 二、JQuery入门使用 1.下载JQuery 2.jQuery快速入门 三、jQuery对象 1.什么是jQuery对象? 2.DOM对象转换成jQuery对象 3.jQuery对象转成DOM对象 四、jQuery选择器 1.jQuery选择器介绍 2.基本选择器 3…