2015-12-27 2 views
3

Я использую WebAPI для загрузки PDF-файла, как это:WebAPI загрузить файл с помощью обработчика

[HttpGet] 
public async Task<HttpResponseMessage> DownloadFile(string id, bool attachment = true) 
{ 
HttpResponseMessage result = null; 

try 
{ 
    MyService service = new MyService(); 
    var bytes = await service.DownloadFileAsync(id); 

    if (bytes != null) 
    { 
     result = GetBinaryFile(personalDocument, string.Format("{0}.pdf", id), attachment); 
    } 
    else 
    { 
     result = new HttpResponseMessage(HttpStatusCode.NotFound); 
    } 
} 
catch (Exception ex) 
{ 
    throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.BadRequest) { ReasonPhrase = "ServerError" }); 
} 

return result; 
} 
private HttpResponseMessage GetBinaryFile(byte[] bytes, string fileName, bool attachment) 
{ 
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); 
    // result.Content = new ByteArrayContent(bytes); 
result.Content = new StreamContent(new System.IO.MemoryStream(bytes)); 
//result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf"); 
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("inline"); 

if (attachment) 
{ 
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); 
} 

result.Content.Headers.ContentDisposition.FileName = fileName; 
result.Content.Headers.ContentLength = bytes.Length; 
return result; 
} 

теперь я вижу, что он заморожен мой сайт, поэтому я хочу, чтобы изменить это, и загрузить файл в формате PDF через обработчик, можно перенаправить на IHttpHandler с любыми изменениями на стороне клиента? по атрибуту Route?

+0

Может быть сделать GetBinaryFile() метод асинхронной а – qamar

+0

GetBinaryFile просто обертка файл с HttpResponseMessage и возвращает результат. –

+0

getbinaryfile - это то, что замерзает ваш сайт. вы должны иметь возможность вызвать ожидание на этом – qamar

ответ

0

статья, которая из http://www.fsmpi.uni-bayreuth.de/~dun3/archives/task-based-ihttpasynchandler/532.html помогает мне реализовать обработчик async.

и web.config возможности маршрута места:

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"></modules> 
    <handlers> 
    <add 
     name="DownFile" 
     path="/api/downloads/MyDownload.axd" 
     type="MyProject.WebApi.Handlers.MyDownloadAsyncHandler, MyProject.WebApi" 
     verb="GET"/> 
    </handlers> 
</system.webServer> 
0

Если я понял ваш вопрос Rigth, вы пытаетесь отправить некоторый контент от сервера к пользователю. Если да, попробуйте использовать тип PushStreamContent и, на самом деле, для этого вам не нужен специальный обработчик.

Пример PushStreamContent с отправкой архива

ZipFile zip = new ZipFile() 

// Do something with 'zip' 

var pushStreamContent = new PushStreamContent((stream, content, context) => 
{ 
    zip.Save(stream); 
    stream.Close(); 
}, "application/zip"); 

HttpResponseMessage response = new HttpResponseMessage 
{ 
    Content = pushStreamContent, 
    StatusCode = HttpStatusCode.OK 
}; 

response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
{ 
    FileName = "fileName" 
}; 

response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip"); 

return response; 
+0

Я не могу, потому что я уже сделал что-то подобное, но всегда в первый раз он заморозил мой сайт, поэтому я использую для этого обработчик. –

+0

На самом деле, я не должен застывать на вашем сайте. возможно, у вас есть некоторые обработчики или логика, которые работают слишком медленно? также, если вы не используете методы async-контроллеров, попробуйте использовать - он также должен удалить все замороженные состояния – Andrew

+0

i, работая с веб-api и угловым сайтом, и, как вы можете видеть, все mehtods являются асинхронными :), но это кажется, что если я скачал файл и установил привязку, чтобы быть правдой, он был заморожен, поэтому я работаю с обработчиком, и проблема решена для меня :) –