2016-03-24 34 views
1

我正在一個使用WebApi2和HttpClient的勝利形式的應用程序的測試應用程序。Web Api 2不返回ByteArrayContent到HTTPClient

我遇到了一個問題,我的HttpClient請求返回HttpResponseMessage的WebApi2控制器不返回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); 
    } 
}