2016-03-24 23 views
1

私は、WinFormsアプリケーションでWebApi2とHttpClientを使用してテストアプリケーションを作成しています。Web Api 2がByteArrayContentをHTTPClientに返さない

私は、HttpResponseMessageを返すWebApi2コントローラへの私のHttpClientリクエストがByteArrayContentを返さないという問題が発生しました。 WebApiControllerコード

[HttpGet] 
public HttpResponseMessage DownloadFilePart(string fileName) 
{ 
    var path = Server.MapPath("~/App_Data/uploads/" + fileName); 
    var fileArray = System.IO.File.ReadAllBytes(path); 

    var response = new HttpResponseMessage(HttpStatusCode.OK) 
    { 
     Content = new ByteArrayContent(fileArray) 
    }; 

    response.Content.Headers.ContentType = new MediaTypeHeaderValue(System.Web.MimeMapping.GetMimeMapping(fileName)); 
    response.Content.Headers.ContentLength = fileArray.Length; 
    response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") 
    { 
     FileName = fileName 
    }; 

    return response; 
} 

WinFormsのコード使用してHttpClientを

static async void GetFilePart(string hostrUri) 
{ 
    var httpClient = new HttpClient 
    { 
     BaseAddress = new Uri(hostrUri) 
    }; 

    var request = new HttpRequestMessage(HttpMethod.Get, "/Home/DownloadFilePart/?fileName=Test.txt"); 
    var responseMessage = httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead); 
    var memoryStream = new MemoryStream(); 
    var stream = await responseMessage.Result.Content.ReadAsByteArrayAsync(); 
    var fileToWriteTo = System.IO.Path.GetDirectoryName(Application.ExecutablePath) + "\\Temp\\Test.txt"; 

    using (var fileStream = new FileStream(fileToWriteTo, FileMode.Create, FileAccess.Write, FileShare.None)) 
    { 
     //copy the content from response to filestream 
     fileStream.Write(stream, 0, stream.Length); 
    } 
} 

要求WEBAPIからのリターンと私はWEBAPI応答から実際のヘッダであるファイルに書き込まれているすべてのことをファイルにバイトを書くとき。どのような問題が起こっているのか誰にも分かっていますか?

おかげ

+0

最初の提案はここのawaitを追加することですし、それを変更するか: 'のvar responseMessageは= httpClient.SendAsyncを待つ...'、あなたがする必要はありません'.Result'は後で、(デッドロックを引き起こす可能性のある)呼び出しをブロックします。 –

+0

ブラウザからAPIエンドポイントを押して、正しいファイルのコンテンツをダウンロードできますか?それは問題がWeb APIコードかWinFormsコードかどうかを示すはずです。一見して私は問題を見つけていない。 –

答えて

1

あなたの問題は

httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead); 

HttpCompletionOption.ResponseHeadersReadが応答が利用可能であり、ヘッダが読み込まれるとすぐに完了する必要があり

操作のように要約されてここにあります。 内容はまだ読み取られていません

これは、応答にヘッダーしか表示されない理由を説明します。

それを完全に削除するか、HttpCompletionOption.ResponseContentRead

static async void GetFilePart(string hostrUri) 
{ 
    var httpClient = new HttpClient 
    { 
     BaseAddress = new Uri(hostrUri) 
    }; 

    var request = new HttpRequestMessage(HttpMethod.Get, "/Home/DownloadFilePart/?fileName=Test.txt"); 
    var responseMessage = await httpClient.SendAsync(request); 
    var byteArray = await responseMessage.Content.ReadAsByteArrayAsync(); 
    var fileToWriteTo = System.IO.Path.GetDirectoryName(Application.ExecutablePath) + "\\Temp\\Test.txt"; 

    using (var fileStream = new FileStream(fileToWriteTo, FileMode.Create, FileAccess.Write, FileShare.None)) 
    { 
     //copy the content from response to filestream 
     fileStream.Write(byteArray, 0, byteArray.Length); 
    } 
} 
関連する問題