问题:
先看下面代码,我通过接口传过去的是字节
[HttpPost]
public async Task<ActionResult<byte[]>> AddWatermarkAction()
{
if (Request.HasJsonContentType())
{
using Stream stream = HttpContext.Request.BodyReader.AsStream();
using StreamReader sr = new StreamReader(stream);
string jsonData = sr.ReadToEnd();
WatermarkParam param = JsonConvert.DeserializeObject<WatermarkParam>(jsonData);
//获取到数据不为空
if (!param.IsNullOrWhiteSpace())
{
//对图片进行处理并生成图片字节返回
byte[] imgBuf = ImgWatermark.AddWatermark(param.WatermarkFile, param.WatermarkText, param.WatermarkPoint, param.WatermarkFont, param.WatermarkColor, param.WatermarkStringFormat);
return imgBuf;
}
}
return BadRequest("Error!!!");
}
这样写的话我在客户端只需要获取到接口返回给我的图片字节,然后将其转为图片即可,如下
if (httpResponse.IsSuccessStatusCode)
{
//获取到处理好的图片数据
byte[] buf = await httpResponse.Content.ReadAsByteArrayAsync();
using MemoryStream ms = new MemoryStream(buf);
//将字节转换为图片
Image image = Image.FromStream(ms);
PicShow.Image = image;
}
但是当图片走到 Image image = Image.FromStream(ms); 这一步时,就报 Parameter is not valid 异常。
后面将客户端获取到的图片字节数组对比接口端生成的图片字节数组,发现两个字节不一样,所以导致我在客户端将其重新转换为图片失败,经过分析,如果不对需要传递的字节数进行加密的话,就会导致传递的字节不一致,导致报错,同样,我们也可以将其转换成 Json 字符串防止修改。
解决办法:
在传递的时候将 字节数组进行加密,接受的时候再用相同的办法进行解密即可
接口修改后
[HttpPost]
public async Task<ActionResult<string>> AddWatermarkAction()
{
try
{
if (Request.HasJsonContentType())
{
using Stream stream = HttpContext.Request.BodyReader.AsStream();
using StreamReader sr = new StreamReader(stream);
string jsonData = sr.ReadToEnd();
WatermarkParam param = JsonConvert.DeserializeObject<WatermarkParam>(jsonData);
if (!param.IsNullOrWhiteSpace())
{
byte[] imgBuf = ImgWatermark.AddWatermark(param.WatermarkFile, param.WatermarkText, param.WatermarkPoint, param.WatermarkFont, param.WatermarkColor, param.WatermarkStringFormat);
//将图片字节加密一下,不然传递过去字节数组会发生变化
string str = Convert.ToBase64String(imgBuf);
int count = str.Length;
return str;
}
}
return BadRequest("Error!!!");
}
catch
{
return BadRequest("Error Exception!!!");
}
}
客户端接受修改:
if (httpResponse.IsSuccessStatusCode)
{
//获取到处理好的图片数据
string retStr = await httpResponse.Content.ReadAsStringAsync();
//解密
byte[] buf = Convert.FromBase64String(retStr);
using MemoryStream ms = new MemoryStream(buf);
//将字节转换为图片
Image image = Image.FromStream(ms);
PicShow.Image = image;
//image.Dispose();//这里赋值给 PicShow 了,不能销毁
this.Btn_Save.Enabled = true;
}