2016-08-11 2 views
2

API에 대한 HMAC 보안을 구현하려고합니다. 파일을 게시 할 때까지 모든 것이 잘 작동합니다.DelegatingHandler 내에서 HttpContent.ReadAsByteArrayAsync()가 오류없이 실패합니다.

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 HttpClient (HMACHttpClient)를 구현 요청에 HMAC 헤더를 부착하기 위해 DelegatingHandler (HMACDelegatingHandler).

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(); 

이 걸려 중지해야합니다.

관련 문제