Загрузка документов через .Net web api из лазурного блоба - PullRequest
0 голосов
/ 03 января 2019

Мне трудно понять, что происходит не так. Мое приложение попадает в API для получения документа. Происходит загрузка, но зависает. В конце концов это закончится (либо с ошибкой, либо полностью), но когда я пытаюсь открыть, скажем, PDF, я получаю «не могу открыть PDF» или что-то в этом роде. Работает локально.

мой контроллер:

 [Route("api/listing/attachment")]
    [HttpGet]
    public async Task<IHttpActionResult> GetAttachmentAsync(string fileName)
    {
        var attachment = await _repository.GetAttachmentAsync(fileName);
        var response = HttpContext.Current.Response;
        response.Clear();
        response.ContentType = "application/x-download";
        var removePath = fileName.Substring(fileName.IndexOf("/", fileName.IndexOf("/", StringComparison.Ordinal) + 1, StringComparison.Ordinal) + 1);
        response.AddHeader("content-disposition", string.Format("attachment; filename={0}", removePath));
        response.AddHeader("content-length", attachment.Length.ToString());
        response.BinaryWrite(attachment);
        response.Flush();
        return null;
    }

мой репозиторий:

public async Task<byte[]> GetAttachmentAsync(string fileName)
    {
        var container = _blobClient.GetContainerReference(_containerName);
        var blockBlob = container.GetBlockBlobReference(fileName);
        using (var memoryStream = new MemoryStream())
        {
            await blockBlob.DownloadToStreamAsync(memoryStream);
            return memoryStream.ToArray();
        }
    }

1 Ответ

0 голосов
/ 03 января 2019

Попробуйте изменить код контроллера на:

[Route("api/listing/attachment")]
[HttpGet]
public async Task<HttpResponseMessage> GetAttachmentAsync(string fileName)
{
    var attachment = await _repository.GetAttachmentAsync(fileName);
    var removePath = fileName.Substring(fileName.IndexOf("/", fileName.IndexOf("/", StringComparison.Ordinal) + 1, StringComparison.Ordinal) + 1);

    var result = new HttpResponseMessage(HttpStatusCode.OK)
    {
        Content = new ByteArrayContent(attachment)
    };
    result.Content.Headers.ContentDisposition =
        new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
    {
        FileName = removePath
    };
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

    return result;
}
...