2015-02-12 4 views
3

В настоящее время я делаю GET методу Web Api и передаю имя файла в качестве параметра. Когда я добираюсь до метода, мои параметры разрешаются правильно, а содержимое файла записывается в контент ответа в объекте HttpResponseMessage.Почему Web Api HttpResponseMessage не загружает файл?

public HttpResponseMessage Get ([FromUri]string filen) 
    { 
     string downloadPath = WebConfigurationManager.AppSettings["DownloadLocation"]; 

     var fileName = string.Format("{0}{1}", downloadPath, filen); 
     var response = Request.CreateResponse(); 

     if (!File.Exists(fileName)) 
     { 
      response.StatusCode = HttpStatusCode.NotFound; 
      response.ReasonPhrase = string.Format("The file [{0}] does not exist.", filen); 

      throw new HttpResponseException(response); 
     } 

     response.Content = new PushStreamContent(async (outputStream, httpContent, transportContext) => 
     { 
      try 
      { 
       var buffer = new byte[65536]; 

       using (var file = File.Open(fileName, FileMode.Open, FileAccess.Read)) 
       { 
        var length = (int)file.Length; 
        var bytesRead = 1; 

        while (length > 0 && bytesRead > 0) 
        { 
         bytesRead = file.Read(buffer, 0, Math.Min(length, buffer.Length)); 
         await outputStream.WriteAsync(buffer, 0, bytesRead); 
         length -= bytesRead; 
        } 
       } 

      } 
      finally 
      { 
       outputStream.Close(); 
      } 

     }); 

     response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
     response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
     { 
      FileName = filen 
     }; 

     return response; 
    } 

Вместо того чтобы видеть загружаемый файл, ничего не происходит. Кажется, что файл просто теряется где угодно. Я хотел бы, чтобы браузер автоматически загружал файл. Я вижу контент в ответе у скрипача. Итак, что случилось? Любые указатели будут оценены!

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Transfer-Encoding: chunked 
Content-Type: application/octet-stream 
Expires: -1 
Server: Microsoft-IIS/8.0 
Content-Disposition: attachment; filename=w-brand.png 
X-AspNet-Version: 4.0.30319 
X-SourceFiles: =?UTF-8?B?RDpcSnVubGlcQXN5bmNGaWxlVXBsb2FkV2ViQVBJRGVtb1xBc3luY0ZpbGVVcGxvYWRXZWJBUElEZW1vXGFwaVxGaWxlRG93bmxvYWQ=?= 
X-Powered-By: ASP.NET 
Date: Thu, 12 Feb 2015 19:32:33 GMT 
27b5 
PNG 
... 

ответ

1

Я не уверен, но вы можете попробовать с этим кодом, он работал для меня:

result = Request.CreateResponse(HttpStatusCode.OK); 
result.Content = new StreamContent(new FileStream(localFilePath, FileMode.Open, FileAccess.Read)); 
result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment"); 
result.Content.Headers.ContentDisposition.FileName = "SampleImg"; 

Может быть, это проблема, связанная с PushStreamContent.

В следующей ссылке вы можете увидеть, как потреблять, что от яваскрипта клиента: How to download memory stream object via angularJS and webaAPI2

Я надеюсь, что это помогает.

+0

Нет, PushStreamContent не является проблемой, так как мы можем получить контент отлично, и хорошо. Я попробовал ваш код, и это тоже не сработало. Возможно, это связано с тем, как я его вызывал? Можете ли вы показать мне свой код вызова? –

+0

Как вы звоните? Вы должны иметь возможность вызвать это с помощью браузера. Если это работает, вы знаете, что проблема в вашем клиентском коде. @junliantolovich – jvrdelafuente

+0

Я думаю, что в этом другом вопросе может быть полезно решить вашу проблему: http://stackoverflow.com/questions/28421480/how-to-download-memory-stream-object-via-angularjs-and-webaapi2/ 28428474 # 28428474 @junliantolovich – jvrdelafuente

Смежные вопросы