2016-08-11 33 views
2

APIのHMACセキュリティを実装しようとしています。ファイルを投稿しようとするまで、すべてうまく動作します。HttpContent.ReadAsByteArrayAsync()はエラーなしでDelegatingHandler内で失敗します

HMACソリューションはここにあります - https://github.com/gavinharriss/WebAPI.HMAC - GETリクエストとPOSTリクエストを許可するための元のフォークです。

ファイル添付するコード:私はすぐにHttpContent.ReadAsByteArrayAsync()を呼び出す場合

var requestContent = new MultipartFormDataContent(); 
var fileContent = new ByteArrayContent(file); 
requestContent.Add(fileContent, "file", filename); 

は問題はないが、バイト配列が利用可能です。

しかし、HMAC HttpClientHMACHttpClient)が実装要求にHMACヘッダを取り付けるためにDelegatingHandlerHMACDelegatingHandler)。

HMACDelegatingHandlerには、プロパティがヘルパーで使用され、HMAC署名を構築するためのリクエストがHttpRequestMessageとして渡されます。

署名を構築し、次のコードは、helper classから呼び出されます。

private static async Task<byte[]> ComputeHash(HttpContent httpContent) 
{ 
    using (var md5 = MD5.Create()) 
    { 
     byte[] hash = null; 
     if (httpContent != null) 
     { 
      var content = await httpContent.ReadAsByteArrayAsync(); // <-- Fails here 
      if (content.Length != 0) 
      { 
       hash = md5.ComputeHash(content); 
      } 
     } 
     return hash; 
    } 
} 

var content = await httpContent.ReadAsByteArrayAsync()ラインがヒットしたコード、そして何も、ないエラーをステップ実行します。リクエストはうまくいくようですが、すべてがまだ実行されており、HttpClientリクエストは送信されません。

何が起こっているのですか?

答えて

2

これをさまざまなサイズのファイルでテストしたところ、ファイルが50,000バイトのマークになったときに問題が発生していました。

この投稿は解決策を提供しました:HttpContent.ReadAsStringAsync causes request to hang (or other strange behaviours)

あなたはHMACHelperでerroringラインを交換する(ライン66)場合:これで

var content = await httpContent.ReadAsByteArrayAsync(); 

var ms = new MemoryStream(); 
await httpContent.CopyToAsync(ms); 
ms.Seek(0, SeekOrigin.Begin); 

var content = ms.ToArray(); 

それがぶら下がって停止する必要があります。

関連する問題