2016-08-11 86 views
2

我試圖實現一個API HMAC安全。一切工作正常,直到我試圖發佈文件。HttpContent.ReadAsByteArrayAsync()沒有錯誤失敗裏面DelegatingHandler

的HMAC解決方案可以在這裏找到 - https://github.com/gavinharriss/WebAPI.HMAC - 這是從原來的叉子,讓GET請求以及POST請求。

附加文件中的代碼:

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

,如果我馬上打電話HttpContent.ReadAsByteArrayAsync()沒有問題,字節數組是可用的。

然而,HMAC HttpClientHMACHttpClient)實現,以便將HMAC頭附加到請求DelegatingHandlerHMACDelegatingHandler)。

HMACDelegatingHandler中,該請求作爲HttpRequestMessage傳遞,HttpRequestMessage.Content屬性用於幫助程序以構建HMAC簽名。

當建立簽名,下面的代碼是從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示數行(第66):

var content = await httpContent.ReadAsByteArrayAsync(); 

與此:

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

var content = ms.ToArray(); 

應該停止掛。