2016-03-24 31 views
1

Bir win form uygulamasında WebApi2 ve HttpClient kullanarak bir test uygulaması hazırlıyorum.Web Api 2 ByteArrayContent, HTTPClient'e dönülmez

HttpClient isteğimin bir HttpResponseMessage döndüren bir WebApi2 denetleyicisine ByteArrayContent döndürmediği bir sorun karşısında karşılaştım. WebApiController Kod

[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 Kod kullanarak 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); 
    } 
} 

istek WebAPI dönüş ve ben WebAPI yanıtından gerçek başlıkları olan dosyaya yazılır tüm bu dosyaya bayt yazdığınızda . Sorunun burada olabileceği konusunda herhangi bir fikri olan var mı?

Teşekkür

+0

İlk öneri olarak değiştirin '.Sonraki 'daha sonra engelleme (potansiyel olarak kilitlenmeye neden olan) bir çağrıdır. –

+0

Bir tarayıcıdan API uç noktasına gidebilir ve doğru dosya içeriğini indirebilir misiniz? Bu, sorunun Web API koduyla mı yoksa WinForms kodunda mı olduğunu size söylemelidir. Bir bakışta problemi tespit etmiyorum. –

cevap

1

Senin sorunun

httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead); 

HttpCompletionOption.ResponseHeadersRead bir tepki mevcuttur ve başlıkları okunur en kısa sürede tamamlamak gerekir

operasyon olarak özetlenmiştir burada. İçerik henüz okunmadı.

Bu, neden yalnızca başlıkları yanıtınıza aldığınızı açıklar. `ResponseMessage = httpClient.SendAsync ...`, o zaman Var gerekmez bekliyor verisimi:

Ya burada bekliyor eklemek olacaktır tamamen kaldırmak veya 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); 
    } 
}