Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Returning byte array from server is different when received by the client

I have a REST API trying to call (acquire) a byte array from my web api. This is my client code:

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

This is my server 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;
    }
}

The byte array returned by the server is:

enter image description here

the byte array received by the client is:

enter image description here

As you can see it is the wrong size and values.

I am assuming this is down to the media header which is currently set at:

httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/Binary"));

Using Fiddler it seems to think it is expecting Json. So I had changed it to 'Application/json'

That did nto work.

I also used base64Binary and that did not work either.

What else can I try?

ADDITIONAL: Result when I type api direct into browser:

<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>

MORE INFO:

If change this:

 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));

To this:

var result = response.Content.ReadAsStringAsync().Result;
byte[] resultFromServer = Encoding.ASCII.GetBytes(result);
byte[] actualBytes = Convert.FromBase64String(Encoding.ASCII.GetString(resultFromServer));

I get the error:

The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters.

This is the value of result

"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=="

From 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=="

To make this finally work I had to do this:

byte[] actualBytes = Convert.FromBase64String(result2.Replace("\"",""));

Thanks

like image 707
Andrew Simpson Avatar asked May 02 '26 13:05

Andrew Simpson


2 Answers

Since you are getting the response as string, just decode that Base64 string.

var result = response.Content.ReadAsStringAsync().Result;
byte[] actualBytes = Convert.FromBase64String(result);
like image 160
Oguz Ozgul Avatar answered May 04 '26 02:05

Oguz Ozgul


After some research i found that asp net core team don't want to fix this issue (https://github.com/aspnet/Mvc/issues/7926), to fix your problem you have to return "FileStreamResult".

Change your controller with this

[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");
}
like image 28
bertasoft Avatar answered May 04 '26 03:05

bertasoft



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!