从服务器返回的字节数组在客户端收到时是不同的
Returning byte array from server is different when received by the client
我有一个 REST API 试图从我的网络 api 调用(获取)一个字节数组。
这是我的客户代码:
Uri uri = new Uri(URL);
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/Binary"));
HttpResponseMessage response = await httpClient.GetAsync(uri + route + "?" + COMPANY_REF + "=" + ApplicationObject.CompanyRef);
response.EnsureSuccessStatusCode();
var result = response.Content.ReadAsByteArrayAsync().Result
这是我的服务器API:
[HttpGet]
public byte[] Get(Guid companyRef)
{
Mapper.CreateMap<Services.Group,Models.Group>();
var test = Mapper.Map<List<Models.Group>>(groupRepository.Get(companyRef));
var t = Compression.Serialize(test);
return t;
}
public static byte[] Serialize(this Object obj)
{
if (obj == null)
{
return null;
}
using (var memoryStream = new MemoryStream())
{
var binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, obj);
var compressed = Compression.Zip(memoryStream.ToArray());
return compressed;
}
}
服务器返回的字节数组为:
客户端收到的字节数组为:
如您所见,大小和值错误。
我假设这取决于媒体 header,目前设置为:
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/Binary"));
使用 Fiddler 似乎认为它正在期待 Json。所以我把它改成了
'Application/json'
那没有用。
我也用了 base64Binary,但也没用。
我还能尝试什么?
附加:
当我直接在浏览器中输入 api 时的结果:
<base64Binary xmlns="http://schemas.microsoft.com/2003/10/Serialization/">
H4sIAAAAAAAEAKWS32vUQBDHN3u5TXJRUSr1B4pBX49g/4CDlhb64K9Dq304jjWXTK/rbXePbCKc4N8qCIIgCILvOnO92KDNkxP2m2SYz8zszjKPMfYLjd5kVzjK7jHMxrasMj1M3kDplDWjnfQxPcNkv9ZVXcLIQF2VFDGuZ1rlT2B1ZBdgRqbW2qd0H1+tXAVn6b7VGvIKk7j0EAyUKk+fKle93ZlM/hRKn9kCNAaUtl4Ok/9tYDrtYQdCKmzA9aVTHyCU788z+YzdvrzuZEq7D8OI4BBXhCugH+ZtPP725SiBkU/SJxEkAck6DeWJBiQxSp/iOvKsK6+/XsKJ/zw7g/gAXF6qJR1gz/Pizake1qqgov5PnF7bSRW4zLiccZlzWXAJXJ5wOefylEvF5TsuF+zCwiDgG2N/mbiKEh/ZIlu55NiWC3GNvOfFPNoo7cT7gR1QF//g11F6e1qLGy1MNNj3LmwLZfDaZM6puYFC3GzRQUN/66K3KeLFEoy41eLChvvaxd2hWY/BFMrMxd0WGjXoly70HqF7M5wmdnu/hQ4a9HMX+oAiDqwBkbS4uOE+dXEPKcLg9RCPaEbFxR2JfwNB64eo1AMAAA==
</base64Binary>
更多信息:
如果改变这个:
var result = response.Content.ReadAsByteArrayAsync().Result;
byte[] resultFromServer = Encoding.ASCII.GetBytes("H4sIAAAAAAAEAKWS32vUQBDHN3u5TXJRUSr1B4pBX49g/4CDlhb64K9Dq304jjWXTK/rbXePbCKc4N8qCIIgCILvOnO92KDNkxP2m2SYz8zszjKPMfYLjd5kVzjK7jHMxrasMj1M3kDplDWjnfQxPcNkv9ZVXcLIQF2VFDGuZ1rlT2B1ZBdgRqbW2qd0H1+tXAVn6b7VGvIKk7j0EAyUKk+fKle93ZlM/hRKn9kCNAaUtl4Ok/9tYDrtYQdCKmzA9aVTHyCU788z+YzdvrzuZEq7D8OI4BBXhCugH+ZtPP725SiBkU/SJxEkAck6DeWJBiQxSp/iOvKsK6+/XsKJ/zw7g/gAXF6qJR1gz/Pizake1qqgov5PnF7bSRW4zLiccZlzWXAJXJ5wOefylEvF5TsuF+zCwiDgG2N/mbiKEh/ZIlu55NiWC3GNvOfFPNoo7cT7gR1QF//g11F6e1qLGy1MNNj3LmwLZfDaZM6puYFC3GzRQUN/66K3KeLFEoy41eLChvvaxd2hWY/BFMrMxd0WGjXoly70HqF7M5wmdnu/hQ4a9HMX+oAiDqwBkbS4uOE+dXEPKcLg9RCPaEbFxR2JfwNB64eo1AMAAA==");
byte[] actualBytes = Convert.FromBase64String(Encoding.ASCII.GetString(resultFromServer));
为此:
var result = response.Content.ReadAsStringAsync().Result;
byte[] resultFromServer = Encoding.ASCII.GetBytes(result);
byte[] actualBytes = Convert.FromBase64String(Encoding.ASCII.GetString(resultFromServer));
我收到错误:
输入的 Base-64 字符串无效,因为它包含 non-base 64 位字符、两个以上的填充字符或填充字符中的非法字符。
这是结果的值
"H4sIAAAAAAAEAKWS32vUQBDHN3u5TXJRUSr1B4pBX49g/4CDlhb64K9Dq304jjWXTK/rbXePb
CKc4N8qCIIgCILvOnO92KDNkxP2m2SYz8zszjKPMfYLjd5kVzjK7jHMxrasMj1M3kDplDWjnfQ
xPcNkv9ZVXcLIQF2VFDGuZ1rlT2B1ZBdgRqbW2qd0H1+tXAVn6b7VGvIKk7j0EAyUKk
+fKle93ZlM/hRKn9kCNAaUtl4Ok/9tYDrtYQdCKmzA9aVTHyCU788z
+YzdvrzuZEq7D8OI4BBXhCugH
+ZtPP725SiBkU/SJxEkAck6DeWJBiQxSp/iOvKsK6+/XsKJ/zw7g/gAXF6qJR1gz/Pizake1qq
gov5PnF7bSRW4zLiccZlzWXAJXJ5wOefylEvF5TsuF
+zCwiDgG2N/mbiKEh/ZIlu55NiWC3GNvOfFPNoo7cT7gR1QF//g11F6e1qLGy1MNNj3LmwLZfD
aZM6puYFC3GzRQUN/66K3KeLFEoy41eLChvvaxd2hWY/BFMrMxd0WGjXoly70HqF7M5wmdnu/h
Q4a9HMX+oAiDqwBkbS4uOE+dXEPKcLg9RCPaEbFxR2JfwNB64eo1AMAAA==
来自 Debug.Write:
"H4sIAAAAAAAEAKWS32vUQBDHN3u5TXJRUSr1B4pBX49g/4CDlhb64K9Dq304jjWXTK/rbXePbCKc4N8qCIIgCILvOnO92KDNkxP2m2SYz8zszjKPMfYLjd5kVzjK7jHMxrasMj1M3kDplDWjnfQxPcNkv9ZVXcLIQF2VFDGuZ1rlT2B1ZBdgRqbW2qd0H1+tXAVn6b7VGvIKk7j0EAyUKk+fKle93ZlM/hRKn9kCNAaUtl4Ok/9tYDrtYQdCKmzA9aVTHyCU788z+YzdvrzuZEq7D8OI4BBXhCugH+ZtPP725SiBkU/SJxEkAck6DeWJBiQxSp/iOvKsK6+/XsKJ/zw7g/gAXF6qJR1gz/Pizake1qqgov5PnF7bSRW4zLiccZlzWXAJXJ5wOefylEvF5TsuF+zCwiDgG2N/mbiKEh/ZIlu55NiWC3GNvOfFPNoo7cT7gR1QF//g11F6e1qLGy1MNNj3LmwLZfDaZM6puYFC3GzRQUN/66K3KeLFEoy41eLChvvaxd2hWY/BFMrMxd0WGjXoly70HqF7M5wmdnu/hQ4a9HMX+oAiDqwBkbS4uOE+dXEPKcLg9RCPaEbFxR2JfwNB64eo1AMAAA=="
为了让这个最终成功,我必须这样做:
byte[] actualBytes = Convert.FromBase64String(result2.Replace("\"",""));
谢谢
由于您得到的响应是字符串,只需解码该 Base64 字符串即可。
var result = response.Content.ReadAsStringAsync().Result;
byte[] actualBytes = Convert.FromBase64String(result);
经过一些研究,我发现 asp 网络核心团队不想解决这个问题 (https://github.com/aspnet/Mvc/issues/7926),要解决您的问题,您必须 return "FileStreamResult".
用这个改变你的控制器
[HttpGet]
public FileStreamResult Get(Guid companyRef)
{
Mapper.CreateMap<Services.Group, Models.Group>();
var test = Mapper.Map<List<Models.Group>>(groupRepository.Get(companyRef));
var t = Compression.Serialize(test);
return File(new MemoryStream(t), "application/octet-stream");
}
我有一个 REST API 试图从我的网络 api 调用(获取)一个字节数组。 这是我的客户代码:
Uri uri = new Uri(URL);
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/Binary"));
HttpResponseMessage response = await httpClient.GetAsync(uri + route + "?" + COMPANY_REF + "=" + ApplicationObject.CompanyRef);
response.EnsureSuccessStatusCode();
var result = response.Content.ReadAsByteArrayAsync().Result
这是我的服务器API:
[HttpGet]
public byte[] Get(Guid companyRef)
{
Mapper.CreateMap<Services.Group,Models.Group>();
var test = Mapper.Map<List<Models.Group>>(groupRepository.Get(companyRef));
var t = Compression.Serialize(test);
return t;
}
public static byte[] Serialize(this Object obj)
{
if (obj == null)
{
return null;
}
using (var memoryStream = new MemoryStream())
{
var binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, obj);
var compressed = Compression.Zip(memoryStream.ToArray());
return compressed;
}
}
服务器返回的字节数组为:
客户端收到的字节数组为:
如您所见,大小和值错误。
我假设这取决于媒体 header,目前设置为:
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/Binary"));
使用 Fiddler 似乎认为它正在期待 Json。所以我把它改成了 'Application/json'
那没有用。
我也用了 base64Binary,但也没用。
我还能尝试什么?
附加: 当我直接在浏览器中输入 api 时的结果:
<base64Binary xmlns="http://schemas.microsoft.com/2003/10/Serialization/">
H4sIAAAAAAAEAKWS32vUQBDHN3u5TXJRUSr1B4pBX49g/4CDlhb64K9Dq304jjWXTK/rbXePbCKc4N8qCIIgCILvOnO92KDNkxP2m2SYz8zszjKPMfYLjd5kVzjK7jHMxrasMj1M3kDplDWjnfQxPcNkv9ZVXcLIQF2VFDGuZ1rlT2B1ZBdgRqbW2qd0H1+tXAVn6b7VGvIKk7j0EAyUKk+fKle93ZlM/hRKn9kCNAaUtl4Ok/9tYDrtYQdCKmzA9aVTHyCU788z+YzdvrzuZEq7D8OI4BBXhCugH+ZtPP725SiBkU/SJxEkAck6DeWJBiQxSp/iOvKsK6+/XsKJ/zw7g/gAXF6qJR1gz/Pizake1qqgov5PnF7bSRW4zLiccZlzWXAJXJ5wOefylEvF5TsuF+zCwiDgG2N/mbiKEh/ZIlu55NiWC3GNvOfFPNoo7cT7gR1QF//g11F6e1qLGy1MNNj3LmwLZfDaZM6puYFC3GzRQUN/66K3KeLFEoy41eLChvvaxd2hWY/BFMrMxd0WGjXoly70HqF7M5wmdnu/hQ4a9HMX+oAiDqwBkbS4uOE+dXEPKcLg9RCPaEbFxR2JfwNB64eo1AMAAA==
</base64Binary>
更多信息:
如果改变这个:
var result = response.Content.ReadAsByteArrayAsync().Result;
byte[] resultFromServer = Encoding.ASCII.GetBytes("H4sIAAAAAAAEAKWS32vUQBDHN3u5TXJRUSr1B4pBX49g/4CDlhb64K9Dq304jjWXTK/rbXePbCKc4N8qCIIgCILvOnO92KDNkxP2m2SYz8zszjKPMfYLjd5kVzjK7jHMxrasMj1M3kDplDWjnfQxPcNkv9ZVXcLIQF2VFDGuZ1rlT2B1ZBdgRqbW2qd0H1+tXAVn6b7VGvIKk7j0EAyUKk+fKle93ZlM/hRKn9kCNAaUtl4Ok/9tYDrtYQdCKmzA9aVTHyCU788z+YzdvrzuZEq7D8OI4BBXhCugH+ZtPP725SiBkU/SJxEkAck6DeWJBiQxSp/iOvKsK6+/XsKJ/zw7g/gAXF6qJR1gz/Pizake1qqgov5PnF7bSRW4zLiccZlzWXAJXJ5wOefylEvF5TsuF+zCwiDgG2N/mbiKEh/ZIlu55NiWC3GNvOfFPNoo7cT7gR1QF//g11F6e1qLGy1MNNj3LmwLZfDaZM6puYFC3GzRQUN/66K3KeLFEoy41eLChvvaxd2hWY/BFMrMxd0WGjXoly70HqF7M5wmdnu/hQ4a9HMX+oAiDqwBkbS4uOE+dXEPKcLg9RCPaEbFxR2JfwNB64eo1AMAAA==");
byte[] actualBytes = Convert.FromBase64String(Encoding.ASCII.GetString(resultFromServer));
为此:
var result = response.Content.ReadAsStringAsync().Result;
byte[] resultFromServer = Encoding.ASCII.GetBytes(result);
byte[] actualBytes = Convert.FromBase64String(Encoding.ASCII.GetString(resultFromServer));
我收到错误:
输入的 Base-64 字符串无效,因为它包含 non-base 64 位字符、两个以上的填充字符或填充字符中的非法字符。
这是结果的值
"H4sIAAAAAAAEAKWS32vUQBDHN3u5TXJRUSr1B4pBX49g/4CDlhb64K9Dq304jjWXTK/rbXePb CKc4N8qCIIgCILvOnO92KDNkxP2m2SYz8zszjKPMfYLjd5kVzjK7jHMxrasMj1M3kDplDWjnfQ xPcNkv9ZVXcLIQF2VFDGuZ1rlT2B1ZBdgRqbW2qd0H1+tXAVn6b7VGvIKk7j0EAyUKk +fKle93ZlM/hRKn9kCNAaUtl4Ok/9tYDrtYQdCKmzA9aVTHyCU788z +YzdvrzuZEq7D8OI4BBXhCugH +ZtPP725SiBkU/SJxEkAck6DeWJBiQxSp/iOvKsK6+/XsKJ/zw7g/gAXF6qJR1gz/Pizake1qq gov5PnF7bSRW4zLiccZlzWXAJXJ5wOefylEvF5TsuF +zCwiDgG2N/mbiKEh/ZIlu55NiWC3GNvOfFPNoo7cT7gR1QF//g11F6e1qLGy1MNNj3LmwLZfD aZM6puYFC3GzRQUN/66K3KeLFEoy41eLChvvaxd2hWY/BFMrMxd0WGjXoly70HqF7M5wmdnu/h Q4a9HMX+oAiDqwBkbS4uOE+dXEPKcLg9RCPaEbFxR2JfwNB64eo1AMAAA==
来自 Debug.Write:
"H4sIAAAAAAAEAKWS32vUQBDHN3u5TXJRUSr1B4pBX49g/4CDlhb64K9Dq304jjWXTK/rbXePbCKc4N8qCIIgCILvOnO92KDNkxP2m2SYz8zszjKPMfYLjd5kVzjK7jHMxrasMj1M3kDplDWjnfQxPcNkv9ZVXcLIQF2VFDGuZ1rlT2B1ZBdgRqbW2qd0H1+tXAVn6b7VGvIKk7j0EAyUKk+fKle93ZlM/hRKn9kCNAaUtl4Ok/9tYDrtYQdCKmzA9aVTHyCU788z+YzdvrzuZEq7D8OI4BBXhCugH+ZtPP725SiBkU/SJxEkAck6DeWJBiQxSp/iOvKsK6+/XsKJ/zw7g/gAXF6qJR1gz/Pizake1qqgov5PnF7bSRW4zLiccZlzWXAJXJ5wOefylEvF5TsuF+zCwiDgG2N/mbiKEh/ZIlu55NiWC3GNvOfFPNoo7cT7gR1QF//g11F6e1qLGy1MNNj3LmwLZfDaZM6puYFC3GzRQUN/66K3KeLFEoy41eLChvvaxd2hWY/BFMrMxd0WGjXoly70HqF7M5wmdnu/hQ4a9HMX+oAiDqwBkbS4uOE+dXEPKcLg9RCPaEbFxR2JfwNB64eo1AMAAA=="
为了让这个最终成功,我必须这样做:
byte[] actualBytes = Convert.FromBase64String(result2.Replace("\"",""));
谢谢
由于您得到的响应是字符串,只需解码该 Base64 字符串即可。
var result = response.Content.ReadAsStringAsync().Result;
byte[] actualBytes = Convert.FromBase64String(result);
经过一些研究,我发现 asp 网络核心团队不想解决这个问题 (https://github.com/aspnet/Mvc/issues/7926),要解决您的问题,您必须 return "FileStreamResult".
用这个改变你的控制器
[HttpGet]
public FileStreamResult Get(Guid companyRef)
{
Mapper.CreateMap<Services.Group, Models.Group>();
var test = Mapper.Map<List<Models.Group>>(groupRepository.Get(companyRef));
var t = Compression.Serialize(test);
return File(new MemoryStream(t), "application/octet-stream");
}