I posted this issue on Stack Overflow at
AngularJS GET byte[] error when downloading binary data using ASP.NET Web API.
I created a simple test case to reproduce this issue. The GET method on the server simply generates a byte[] that has 256 elements with values 0-255.
When I wrote an alternate implementation in my SPA using vanilla XMLHttpRequest the data is read properly and the returned data is in the correct array format.
There are 3 issues that I have documented at the link above.
- The first issue with the Angular code is that it interprets the data as a string, NOT a byte array, while the XMLHttpRequest code interprets that code correctly as a byte array.
- The second issue is that the AngularJS code corrupts all values greater than 127 (i.e., 128-255). See link above.
- The third issue is that data is lost. The reconstructed data in the AngularJS code had only 217 bytes instead of 256 bytes.
It seems logical that there are two possibilities: 1) My AngularJS code has a error or missing information (likely, and I am all ears), or 2) AngularJS has a bug that is causing this.
The code that I used is documented at the link provided above, along with detailed tests/results.
I found something when I stepped through the Angular $http code that didn't seem right to me. In these code blocks, the responseType was set to "arrayBuffer", which is correct.
function $http(requestConfig) {
var config = {
method: 'get',
transformRequest: defaults.transformRequest,
transformResponse: defaults.transformResponse
};
var headers = mergeHeaders(requestConfig);
************************************************************************
// TODO(vojta): fix the signature
return function(method, url, post, callback, headers, timeout, withCredentials, responseType) {
var status;
************************************************************************
if (responseType) {
try {
xhr.responseType = responseType;
} catch (e) {
// WebKit added support for the json responseType value on 09/03/2013
************************************************************************
However, in the following code block, the responseType value seems to have been cleared.
// responseText is the old-school way of retrieving response (supported by IE8 & 9)
// response/responseType properties were introduced in XHR Level2 spec (supported by IE10)
response = ('response' in xhr) ? xhr.response : xhr.responseText;
From what I have read, the responseType should be set to “arrayBuffer” at this point in the code. Other than this data possibly being incorrect at the point in the code, I do not have a clue as to what might be causing this issue.
I have been working on an Angular fix for over a week, but have only found a solution that is outside the Angular Framework.
Thanks much for your consideration...