在 POST 请求中返回 byte[] 数据与通过 HttpWebRequest 调用它时需要的数据 return 不同
Returning byte[] data on POST request in does not return the same data I need when calling it through HttpWebRequest
我的 ASP.NET 核心控制器中有一个简单的 POST 方法,我通过 HttpWebRequest 调用它来演示问题。
这是我的控制器方法代码:
[HttpPost]
[Route("test")]
public byte[] Test()
{
var resp = new byte[] {1, 2, 3};
return resp;
}
这是我调用它的客户端代码:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://127.0.0.1:8080/SCVP/test");
request.Method = "POST";
WebResponse response = request.GetResponse();
Stream dataStream = response.GetResponseStream();
using (MemoryStream ms = new MemoryStream())
{
dataStream.CopyTo(ms);
byte[] data = ms.ToArray();
}
问题是,当我调试时,我看到从控制器发回的 byte[] 是正确的 [1, 2, 3],但是,当我在客户端接收到它时,它的长度为6 和字节完全不同。
我认为这可能与内容类型有关,但经过一些 Google 搜索后,似乎 return 一个字节 [] 不需要提供特定的内容类型。
我在这里错过了什么?
编辑:我需要它是 POST,因为我正在发布数据,但为了简单起见,我在这里省略了它。我还需要 return 一个字节数组。
您从服务器获得的响应实际上是 base64 编码的 JSON 响应
尝试先将其作为字符串响应读取,然后将其转换回字节数组。
using (MemoryStream ms = new MemoryStream())
{
dataStream.CopyTo(ms);
ms.Position = 0;
string rawValue = System.Text.Encoding.UTF8.GetString(ms.ToArray());
byte[] data = Convert.FromBase64String(JsonConvert.DeserializeObject<string>(rawValue));
}
我知道问题出在哪里了。
ASP.NET 在后台将 byte[] 转换为 Base64。因此,我收到的 byte[] 应该这样转换:
using (MemoryStream ms = new MemoryStream())
{
dataStream.CopyTo(ms);
byte[] data = ms.ToArray();
byte[] originalData =
Convert.FromBase64String(Encoding.UTF8.GetString(data).Replace("\"", ""));
}
或者(为了避免必须用“”替换“\”),我将控制器方法更改为:
[HttpPost]
[Route("test")]
public IActionResult Test()
{
var resp = new byte[] {1, 2, 3};
return Content(Convert.ToBase64String(resp));
}
客户这样调用:
using (MemoryStream ms = new MemoryStream())
{
dataStream.CopyTo(ms);
byte[] data = ms.ToArray();
byte[] originalData =
Convert.FromBase64String(Encoding.UTF8.GetString(data));
}
我的 ASP.NET 核心控制器中有一个简单的 POST 方法,我通过 HttpWebRequest 调用它来演示问题。
这是我的控制器方法代码:
[HttpPost]
[Route("test")]
public byte[] Test()
{
var resp = new byte[] {1, 2, 3};
return resp;
}
这是我调用它的客户端代码:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://127.0.0.1:8080/SCVP/test");
request.Method = "POST";
WebResponse response = request.GetResponse();
Stream dataStream = response.GetResponseStream();
using (MemoryStream ms = new MemoryStream())
{
dataStream.CopyTo(ms);
byte[] data = ms.ToArray();
}
问题是,当我调试时,我看到从控制器发回的 byte[] 是正确的 [1, 2, 3],但是,当我在客户端接收到它时,它的长度为6 和字节完全不同。
我认为这可能与内容类型有关,但经过一些 Google 搜索后,似乎 return 一个字节 [] 不需要提供特定的内容类型。
我在这里错过了什么?
编辑:我需要它是 POST,因为我正在发布数据,但为了简单起见,我在这里省略了它。我还需要 return 一个字节数组。
您从服务器获得的响应实际上是 base64 编码的 JSON 响应 尝试先将其作为字符串响应读取,然后将其转换回字节数组。
using (MemoryStream ms = new MemoryStream())
{
dataStream.CopyTo(ms);
ms.Position = 0;
string rawValue = System.Text.Encoding.UTF8.GetString(ms.ToArray());
byte[] data = Convert.FromBase64String(JsonConvert.DeserializeObject<string>(rawValue));
}
我知道问题出在哪里了。
ASP.NET 在后台将 byte[] 转换为 Base64。因此,我收到的 byte[] 应该这样转换:
using (MemoryStream ms = new MemoryStream())
{
dataStream.CopyTo(ms);
byte[] data = ms.ToArray();
byte[] originalData =
Convert.FromBase64String(Encoding.UTF8.GetString(data).Replace("\"", ""));
}
或者(为了避免必须用“”替换“\”),我将控制器方法更改为:
[HttpPost]
[Route("test")]
public IActionResult Test()
{
var resp = new byte[] {1, 2, 3};
return Content(Convert.ToBase64String(resp));
}
客户这样调用:
using (MemoryStream ms = new MemoryStream())
{
dataStream.CopyTo(ms);
byte[] data = ms.ToArray();
byte[] originalData =
Convert.FromBase64String(Encoding.UTF8.GetString(data));
}