C# webapi接口传输byte[]数据,报错:415 Unsupported Media Type

news2024/11/14 1:50:13

最近需要做上传文件操作。 由于历史原因,以前的接口使用了这样的入参:

 代码如下:

/// <summary>
/// 上传文件
/// </summary>
[HttpPost]
public Result<UploadImageResult> UploadFile(byte[] bytes, string extName, string fromUri)
{
    //业务代码
}

这个接口是一个POST请求的接口,调用接口之前,需要先将文件转换成文件流,再转换成byte数组的进行上传。

上传时调用此接口,然后返回这个文件的线上地址。

第一个入参是byte[]数组,第二、第三个入参是string类型的。

之前通过包装一层转发调用的,所以没有调用的实例。

最近需要通过Http直接调用,于是想了各种办法,但是一直报错:

415 Unsupported Media Type

各种测试期间,还报错过:

Unable to translate bytes [FF] at index 35 from specified code page to Unicode

参考了

1.   c# - Post byte array to Web API server using HttpClient - Stack Overflow

2. 

asp.net - Unable to translate bytes [FC] at index 35 from specified code page to Unicode - Stack Overflow

这些里面的方法,但是也没有解决。

尝试了各种改动,包括:

Content-Type 改为 application/octet-stream

Content-Type 改为 application/bson

Content-Type 改为 multipart/form-data

上面的改动也对应这Parameters的各种改动,都失败了。

还有这样的(失败案例,不过这是multipart/form-data传数据的正确用法):

byte[] fileBytes = new byte[] { 1, 2 };
string extName = "jpg";
string fromUri = "test";
var uploadUrl = "http://localhost:8101/Upload/UploadFile";

try
{
    HttpClient InternalHttpClient = new HttpClient();
    var strBoundary = DateTime.Now.Ticks.ToString("x"); //分隔符
    var resultContent = new MultipartFormDataContent(strBoundary);

    var fileByteArrayContent = new ByteArrayContent(fileBytes);
    fileByteArrayContent.Headers.ContentType = new MediaTypeHeaderValue("application/x-jpg");
    fileByteArrayContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = "bytes", FileName = "test.jpg" };
    resultContent.Add(fileByteArrayContent);

    var valueBytes1 = Encoding.UTF8.GetBytes(extName);
    var byteArray1 = new ByteArrayContent(valueBytes1);
    byteArray1.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = "extName" };
    resultContent.Add(byteArray1);

    var valueBytes2 = Encoding.UTF8.GetBytes(fromUri);
    var byteArray2 = new ByteArrayContent(valueBytes2);
    byteArray2.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = "fromUri" };
    resultContent.Add(byteArray2);

    var message = new HttpRequestMessage(HttpMethod.Post, uploadUrl);
    message.Content = resultContent;
    var responseMessage = InternalHttpClient.SendAsync(message).Result;
    using (HttpContent ResponseBytes = responseMessage.Content)
    {
        var content = ResponseBytes.ReadAsStringAsync().Result;
    }

}
catch (Exception ex)
{
    string exstr = ex.Message;
}

上面这个失败的原因是:

bytes虽然我传输的是文件,但是bytes本身不是文件,所以不能把含有文件数据的bytes当做文件看,而是要把它当做一个json来看,只不过这个json是一个纯数字的json数组。

然后问了公司大佬,给我一个postman的调用示例,才知道原来自己的方向一直是错的。

由于上面的接口定义了三个参数,都没有经过类封装,所以这个接口直接就是三个参数的,接口默认是将bytes这个参数作为body主体的。 所以bytes传值时其实是json格式的一个body。

而extName和fromUri两个参数因为没有定义是什么参数类型,也没有封装到封装到类里,所以就作为url传值了。

所以在postman这样的工具传值时,应该是这样的:

 这样传值,然后就成功了。

那么知道上面的原因之后,就比较好操作了

通过HttpClient请求是这样的:

byte[] fileBytes = new byte[] { 1, 2 };
string extName = "jpg";
string fromSource = "test";
var uploadUrl = "http://localhost:8101/Upload/UploadFile";
try
{
    var newUrl = $"{uploadUrl}?extName={extName}&fromUri={fromUri}";
    var client = new HttpClient();
    HttpContent content = new StringContent(JsonConvert.SerializeObject(fileBytes));
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    HttpResponseMessage response = client.PostAsync(newUrl, content).Result;
    response.EnsureSuccessStatusCode();
    string con = response.Content.ReadAsStringAsync().Result;
}
catch (Exception ex)
{
    string exstr = ex.Message;
}

通过RestClient请求是这样的:(需要引用RestSharp.dll)

byte[] fileBytes = new byte[] { 1, 2 };
string extName = "jpg";
string fromSource = "test";
var uploadUrl = "http://localhost:8101/Upload/UploadFile";
try
{
    RestResponse Rsp;
    var newUrl = $"{uploadUrl}?extName={extName}&fromUri={fromUri}";
    using (var client = new RestClient(uploadUrl))
    {
        var Req = new RestRequest(newUrl, Method.Post);
        Req.AddHeader("Content-Type", "application/json");
        Req.AddBody(JsonConvert.SerializeObject(fileBytes));
        Rsp = client.ExecuteAsync(Req).Result;
    }
}
catch (Exception ex)
{
    string exstr = ex.Message;
}

然后传值就成功了。

没找准问题所在,连搜答案都是错的。

要向正确的人问正确的问题,才能得到正确的答案。

一把辛酸泪,在此做个记录

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

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

相关文章

html框架-----标签(上)

目录 前言&#xff1a; 标签简介 1. HTML的基本结构 (1)html标签 (2)head标签 &#xff08;3&#xff09;body标签 2. 标题标签 3. 段落标签 4. 文本格式化标签 前言&#xff1a; 现在学前端工程师的都很难找工作&#xff0c;懂的都懂了&#xff0c;因为学前端一般去做那…

console.log是异步还是同步?为什么console.log有时候不准

console.log是异步还是同步 在前端开发中&#xff0c;控制台console.log通常是同步的。这意味着&#xff0c;当代码执行到console.log语句时&#xff0c;它会立即写入到控制台中&#xff0c;并且JavaScript代码执行会在console.log完成后继续进行。 但是&#xff0c;在某些情况…

# croc用法实践(设备间文件或文件夹传输)

croc用法实践&#xff08;设备间文件或文件夹传输&#xff09; 文章目录 croc用法实践&#xff08;设备间文件或文件夹传输&#xff09;1 安装2 使用示例2.1 发送文件2.2 发送文件夹2.3 发送文本字符串2.4 发送时指定code&#xff0c;接收时自动【Y】&#xff0c;并保存到指定目…

《MySQL(一):基础篇-MySQL概述》

文章目录 1. MySQL概述1.1 数据库相关概念1.2 MySQL数据库1.2.1 版本1.2.2 下载1.2.3 安装1.2.4 启动停止1.2.5 客户端连接1.2.6 数据模型1. MySQL概述 1.1 数据库相关概念 先来了解三个概念:数据库、数据库管理系统、SQL。 而目前主流的关系型数据库管理系统的市场占有率…

ic验证的主要工作流程和验证工具是什么?

验证其实是一个“证伪”的过程&#xff0c;从流程到工具&#xff0c;验证工程师的终极目的都只有一个&#xff1a; 发现所有BUG&#xff0c;或者证明没有BUG&#xff0c;以保证芯片功能性能的正确性和可靠性。 验证环节对于一颗芯片的重要性也是不言而喻的&#xff1a; 从项…

VMware16安装Linux CentOS7完整教程(附下载地址)

一、准备工作 1.安装VMware Workstation Pro 16 &#xff08;1&#xff09;百度网盘下载地址 链接:https://pan.baidu.com/s/1jv0kQ26TLMt9MzofImRzgA?pwds0m1 提取码&#xff1a;s0m1 &#xff08;2&#xff09;VMware官网 https://www.vmware.com/cn &#xff08;2&#x…

广通优云徐育毅:筑基数字化,打造中国IT运维新范式

2023年2月&#xff0c;中共中央、国务院印发《数字中国建设整体布局规划》&#xff0c;数字技术与经济、政治、文化、社会等各领域融合愈发紧密&#xff0c;一册百花齐放、生机勃勃的数字化图卷正徐徐展开。 随着数字中国战略深入推进&#xff0c;IT运维作为核心领域受到关注。…

傻瓜式git管理。全平台,全编译器通用。github desktop+vscode

文章目录 前言Github desktop资源地址推荐理由操作介绍打开界面介绍Github账号登录Github仓库导入 从零开始新建Gitee仓库登录或注册gitee仓库Gitee新建仓库输入仓库名&#xff0c;添加gitignore,Readme什么是.gitignore什么是README 新建仓库效果github desktop使用新建本地仓…

Android播放器拖动进度条的小图预览

Android播放器拖动进度条的小图预览 背景效果图关键代码1. 获取指定位置的视频帧2. 预览图的显示和隐藏 完整代码1. xml布局文件activity_video.xml2. Activity文件VideoActivity.java 背景 我们在使用一些播放器时&#xff0c;拖动进度条会有一个预览框&#xff0c;上一篇博客…

海康、大华、tplink监控摄像头和硬盘录像机接入GB28181平台配置细节

海康、大华、tplink等各种型号监控摄像头或硬盘录像机(NVR/HVR)接入GB28181平台&#xff0c;配置过程都非常简单明了&#xff0c;但有些细节需要注意&#xff0c;避免走弯路踩泥坑。 首先要说明一点的是&#xff0c;只要监控设备和GB28181平台的网络是连通的&#xff0c;都可以…

5月第4周榜单丨飞瓜数据B站UP主排行榜单(哔哩哔哩)发布!

飞瓜轻数发布2023年5月22日-5月28日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B…

chatgpt赋能python:Python中提取纯数字的方法

Python中提取纯数字的方法 在数据清洗和数据分析中&#xff0c;经常需要将文本中的数字提取出来&#xff0c;用于后续的计算或统计分析。Python作为一种流行的数据处理语言&#xff0c;提供了多种方法来完成这个任务。 方法一&#xff1a;使用正则表达式 正则表达式是一种强…

什么是精细化管理?怎样做好精细化管理?

俗话说&#xff0c;细节决定成败&#xff0c;企业管理也一样&#xff0c;精细化管理尤为重要。 01 什么是精细化管理 精细化管理是企业管理的一种理念&#xff0c;可追溯至20世纪50年代泰勒科学管理。也可以说是一种文化&#xff0c;以最大限度地减少管理所占用的资源和降低管…

超详细的 Wireshark 使用教程

一、wireshark是什么&#xff1f; wireshark是非常流行的网络封包分析软件&#xff0c;简称小鲨鱼&#xff0c;功能十分强大。可以截取各种网络封包&#xff0c;显示网络封包的详细信息。 wireshark是开源软件&#xff0c;可以放心使用。可以运行在Windows和Mac OS上。对应的…

(双指针 ) 18. 四数之和 ——【Leetcode每日一题】

❓18. 四数之和 难度&#xff1a;中等 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重…

Linux系统下imx6ull QT编程—— C++重载(六)

Linux QT编程 文章目录 Linux QT编程前言一、函数重载示例 二、运算符重载1.示例 前言 C 允许在同一作用域中的某个函数和运算符指定多个定义&#xff0c;分别称为函数重载和运算符重载。重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明&#xf…

如何实现 ESP 设备多证书管理?

设置特定分区存储证书文件多证书文件管理证书格式转换证书下载使用证书文件 1、设置特定分区存储证书文件 在项目工程下分区表文件下定义证书分区表文件&#xff0c;如下&#xff1a; 如上&#xff0c;转换的 certificate.bin 下载地址就为 0x41000证书分区文件的大小可不做设…

Benewake(北醒) 快速实现 TF02-Pro-IIC 与电脑通信操作说明

目录 1. 概述2. 测试准备2.1 工具准备2.2通讯协议转换 3. IIC通讯测试3.1 引脚说明3.2 测试步骤3.2.1 TF02-Pro-IIC 与 PC 建立连接3.2.2 获取测距值3.2.3 更改 slave 地址 1. 概述 通过本文档的概述&#xff0c;能够让初次使用测试者快速了解测试 IIC 通信协议需要的工具以及…

度量学习:使用多类N对损失改进深度度量学习

度量学习系列 Author: 码科智能 使用多类N对损失改进深度度量学习 度量学习是ReID任务中常用的方式之一&#xff0c;今天来看下一篇关于如何改进度量学习的论文。来自2016年NeurIPS上的一篇论文&#xff0c;被引用超过900次。 论文&#xff1a;Improved Deep Metric Learni…

针对蓝桥杯竞赛(Python)的基础知识 No.1

首先我们要知道Python是有着大量的库&#xff08;模块、类、函数&#xff09;的&#xff0c;所谓善借其器,善用其利 Q1、日期问题 掌握 datetime库 eg&#xff1a;小蓝每周六、周日都晨跑&#xff0c;每月的 1、11、21、31日也晨跑。其它时间不晨跑。已知 2022年1月1日是周六&…