2016-08-11 129 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(); 

应该停止挂。