APIのHMACセキュリティを実装しようとしています。私はMultipartFormDataContent
のファイルの横にデータ値を投稿しようとするまで、すべてうまく動作します。複数のコンテンツタイプが存在する場合、HttpContentバイトの読み取りがDelegatingHandler内で失敗する
HttpClient
DelegatingHandler
は、バイトを読み取る非同期コード行がヒットしたときに自動的に失敗します。ここで
は要求を構築するコードです:
private FileOutputViewModel GetApiOutput(Uri apiResource, string filename, byte[] file, IDictionary<string, string> extraParameters)
{
FileOutputViewModel result = new FileOutputViewModel();
if (file != null)
{
using (var content = new MultipartFormDataContent())
{
if (extraParameters != null)
{
foreach (var param in extraParameters)
{
content.Add(new StringContent(param.Value), param.Key); // <- If I don't have this, everything works fine
}
}
var fileContent = new ByteArrayContent(file);
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = filename
};
content.Add(fileContent);
var response = HttpClient.PostAsync(apiResource.ToString(), content).Result;
result.Output = JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result);
result.Filename = Path.GetFileName(filename);
}
}
return result;
}
私はDelegatingHandler
すべてがうまく動作しますが、HMACのセキュリティはそうAPIの最後に拒否された要求のために実装されていない使用しない場合。
ファイルの横にStringContent
個のアイテムを使用してデータ値を追加しないと、バイトを読み取る際に問題はありません。しかし、私はファイルと一緒に多くの情報を渡す必要があるので、不完全な要求が残されています。
DelegatingHandler
に失敗したコード行を以下に示す:
private static async Task<byte[]> ComputeHash(HttpContent httpContent)
{
using (var md5 = MD5.Create())
{
byte[] hash = null;
if (httpContent != null)
{
var ms = new MemoryStream();
await httpContent.CopyToAsync(ms); // <- Fails here
ms.Seek(0, SeekOrigin.Begin);
var content = ms.ToArray();
if (content.Length != 0)
{
hash = md5.ComputeHash(content);
}
}
return hash;
}
}
もともとは失敗のラインだった:(前の
var content = await httpContent.ReadAsByteArrayAsync();
が、これは自分自身でも、単にファイルで失敗しましたStackoverflow question)。 MemoryStream
を使用することは、一歩前進していたが、私を完全には得られなかった。
どのようにすればこの問題を回避できますか?