从客户端接收到的从服务器返回的字节数组是不同的

问题描述 投票:2回答:2

我有一个REST API试图从我的Web 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;
    }
}

服务器返回的字节数组是:

enter image description here

客户端收到的字节数组是:

enter image description here

您可以看到它的大小和值是错误的。

我假设这取决于当前设置在的媒体头:

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字符串,因为它包含非Base 64字符,两个以上的填充字符或填充字符中的非法字符。

这是结果的值

“ H4sIAAAAAAAEAKWS32vUQBDHN3u5TXJRUSr1B4pBX49g / 4CDlhb64K9Dq304jjWXTK / rbXePbCKc4N8qCIIgCILvOnO92KDNkxP2m2SYz8zszjKPMfYLjd5kVzjK7jHMxrasMj1M3kDplDWJnfQxPcNkv9ZVXcLIQF2VFDGuZ1rlT2B1ZBdgRqbW2qd0H1 + tXAVn6b7VGvIKk7j0EAyUKk+ fKle93ZlM / hRKn9kCNAaUtl4Ok / 9tYDrtYQdCKmzA9aVTHyCU788z+ YzdvrzuZEq7D8OI4BBXhCugH+ ZtPP725SiBkU / SJxEkAck6DeWJBiQxSp / iOvKsK6 + / XsKJ / zw7g / gAXF6qJR1gz / Pizake1qqgov5PnF7bSRW4zLiccZlzWXAJXJ5wOefylEvF5TsuF+ zCwiDgG2N / mbiKEh / ZIlu55NiWC3GNvOfFPNoo7cT7gR1QF // g11F6e1qLGy1MNNj3LmwLZfDaZM6puYFC3GzRQUN / 66K3KeLFEoy41eLChvvaxd2hWY / BFMrMxd0WGjXoly70HqF7M5wmdnu / hQ4a9HMX + 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("\"",""));

谢谢

c# rest serialization bytearray asp.net-web-api
2个回答
2
投票

由于您将响应作为字符串获取,因此只需解码该Base64字符串即可。

var结果= response.Content.ReadAsStringAsync()。Result;byte [] actualBytes = Convert.FromBase64String(result);


0
投票

经过一些研究,我发现ASP Net Core团队不希望解决此问题(https://github.com/aspnet/Mvc/issues/7926),要解决您的问题,您必须返回“ 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");
}
© www.soinside.com 2019 - 2024. All rights reserved.