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

您所在的位置:网站首页 springboot415错误 C# webapi接口传输byte[]数据,报错:415 Unsupported Media Type

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

2023-05-31 21:51| 来源: 网络整理| 查看: 265

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

 代码如下:

/// /// 上传文件 /// [HttpPost] public Result 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; }

然后传值就成功了。

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

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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3