2015-03-18 3 views
2

У меня есть метод контроллера, который возвращает байт [].Байт возврата [] из ASP.net MVC 4 WEB API-контроллер

[ActionName("testbytes")] 
public byte[] GetTestBytes() { 
    var b = new byte[] {137, 80, 78, 71}; 
    return b; 
} 

Когда я ударил api, я получаю следующий результат.

<base64Binary xmlns="http://schemas.microsoft.com/2003/10/Serialization/">iVBORw==</base64Binary> 

Также, когда я ударил этот api из пользовательского HttpClient, я получаю 10 байтов в качестве ответа. Ниже приведен код пользовательского HttpClient.

public async Task<byte[]> GetTestBytes() { 
    var uri = "apiPath/testbytes"; 
    using (var client = new HttpClient()) 
    { 
     var httpResponse = await client.GetAsync(uri, HttpCompletionOption.ResponseContentRead); 
     if (httpResponse.IsSuccessStatusCode) { 
      var bytes = await httpResponse.Content.ReadAsByteArrayAsync(); 
     } 
     return bytes; 
    } 
    return null; 
} 

Я ожидаю 4 байта, пока я получаю 10 байт в ответ.

+0

Что вы ожидаете от 4 байтов? Это 4 байта. http://tomeko.net/online_tools/base64.php?lang=en – Aron

+0

да. Я должен получить 4 байта, т. Е. 137, 80, 78, 71 –

+1

Это 4 байта. Кодирование Base64 кодирует двоичные файлы в печатные символы, поэтому требуется 4 байта для хранения 4 байтов, в данном случае 10 байт. – Aron

ответ

2

@Markand: Когда вы ударяете API, ответ возвращается будет обернут в двойные кавычки ("responsebodygoeshere")

Так следующий массив байтов

вар б = новый байт [] {137 , 80, 78, 71};

сериализации, как "iVBORw =="

В связи с этим при вызове httpResponse.Content.ReadAsByteArrayAsync(); вы получите байт представление «iVBORw ==» (который будет 10 байт), а не для iVBORw ==

При желании вы можете прочитать содержимое ответа как строку, а затем обрезать кавычки, а затем преобразовать его на байт [] (Там может быть более эффективным подходом. :))

т.е.

затем вызвать следующий метод, чтобы получить байты

var bytesResponse = Convert.FromBase64String(response); 
Смежные вопросы