2015-11-08 43 views
1

我有一個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

正如你可以看到它是錯誤的大小和值。

我假定這是到目前設置在媒體標題:它似乎認爲它期待的Json

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

使用招。所以我把它改爲 '應用程序/ 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字符串,因爲它包含非基本64字符,多於兩個填充字符或填充字符中的非法字符。

這是結果的值

「H4sIAAAAAAAEAKWS32vUQBDHN3u5TXJRUSr1B4pBX49g/4CDlhb64K9Dq304jjWXTK/rbXePb CKc4N8qCIIgCILvOnO92KDNkxP2m2SYz8zszjKPMfYLjd5kVzjK7jHMxrasMj1M3kDplDWjnfQ xPcNkv9ZVXcLIQF2VFDGuZ1rlT2B1ZBdgRqbW2qd0H1 + tXAVn6b7VGvIKk7j0EAyUKk + fKle93ZlM/hRKn9kCNAaUtl4Ok/9tYDrtYQdCKmzA9aVTHyCU788z + YzdvrzuZEq7D8OI4BBXhCugH + ZtPP725SiBkU/SJxEkAck6DeWJBiQxSp/iOvKsK6 +/XsKJ/zw7g/gAXF6qJR1gz/Pizake1qq gov5PnF7bSRW4zLiccZlzWXAJXJ5wOefylEvF5TsuF + zCwiDgG2N/mbiKEh/ZIlu55NiWC3GNvOfFPNoo7cT7gR1QF // g11F6e1qLG y1MNNj3LmwLZfD aZM6puYFC3GzRQUN/66K3KeLFEoy41eLChvvaxd2hWY/BFMrMxd0WGjXoly70HqF7M5wmdnu /小時 Q4a9HMX + oAiDqwBkbS4uOE + dXEPKcLg9RCPaEbFxR2JfwNB64eo1AMAAA == 「

從Debug.Write:

」 H4sIAAAAAAAEAKWS32vUQBDHN3u5TXJRUSr1B4pBX49g/4CDlhb64K9Dq304jjWXTK/rbXePbCKc4N8qCIIgCILvOnO92KDNkxP2m2SYz8zszjKPMfYLjd5kVzjK7jHMxrasMj1M3kDplDWjnfQxPcNkv9ZVXcLIQF2VFDGuZ1rlT2B1ZBdgRqbW2qd0H1 + tXAVn6b7VGvIKk7j0EAyUKk + fKle93ZlM/hRKn9kCNAaUtl4Ok/9tYDrtYQdCKmzA9aVTHyCU788z + YzdvrzuZEq7D8OI4BBXhCugH + ZtPP725SiBkU/SJxEkAck6DeWJBiQxSp/iOvKsK6 +/XsKJ/zw7g/gAXF6qJR1gz/Pizake1qqgov5PnF7bSRW4zLiccZlzWXAJXJ5wOefylEvF5TsuF + zCwiDgG2N/mbiKEh/ZIlu55NiWC3GNvOfFPNoo7cT7gR1QF // g11F6e1qLGy1MNNj3LmwLZfDaZM6puYFC3GzRQUN/66K3KeLFEoy41eLChvvaxd 2hWY/BFMrMxd0WGjXoly70HqF7M5wmdnu/hQ4a9HMX + oAiDqwBkbS4uOE + dXEPKcLg9RCPaEbFxR2JfwNB64eo1AMAAA ==」

爲了使這一工作,最終我不得不這樣做:

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

感謝

+0

你有沒有考慮過將結果字節數組轉換成uft-8字符串還是僅僅將內容讀取爲字符串?也許有我們隱藏在那裏的一些信息 –

+0

@RX_DID_RX嗨,謝謝你憐憫我。我編輯了我的問題,以顯示如果直接在瀏覽器中輸入API,會發生什麼情況。我當然會按照您的建議轉換爲utf-8並回報。謝謝 –

+0

@RX_DID_RX我從utf-8獲得的所有內容與附加信息相同:( –

回答

2

因爲你所得到的響應,字符串,剛剛解碼Base64字符串。

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

+0

嗨,我得到了一個更加奇怪的結果,我將編輯我的問題來解釋 –

+0

但是我可以成功獲取actualBytes並可以看到它和你從web服務器發送的byte []一樣,在你編輯你的文章後,我複製了base64內容並將其分配給了結果,並且仍然成功 –

+0

好吧,現在你已經得到了字符串結果,那麼你只能解碼它 –

相關問題