WebAPIからバイト配列を呼び出そう(取得)しようとしているRESTAPIがあります。これは私のクライアントコードです:
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;
}
}
サーバーから返されるバイト配列は次のとおりです。
クライアントが受信するバイト配列は次のとおりです。
ご覧のとおり、サイズと値が間違っています。
私はこれが現在設定されているメディアヘッダーにあると仮定しています:
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));
エラーが発生します:
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 = = "
これを最終的に機能させるために、私はこれをしなければなりませんでした:
byte[] actualBytes = Convert.FromBase64String(result2.Replace("\"",""));
ありがとう
応答を文字列として取得しているので、そのBase64文字列をデコードするだけです。
var result = response.Content.ReadAsStringAsync().Result;
byte[] actualBytes = Convert.FromBase64String(result);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加