Возврат элемента мультимедиа Sitecore из вызова WebAPI

У меня есть следующий код. Я проверил, что GetMediaItemByID возвращает ожидаемый элемент мультимедиа, а тип mime — «application/pdf». Однако, когда я нажимаю контроллер, который вызывает этот код, Acrobat жалуется, что полученный файл PDF недействителен. Я просмотрел полученный файл PDF в текстовом редакторе, и это двоичные данные. Есть идеи, где я ошибаюсь?

public HttpResponseMessage RetrieveDocument(ID mediaID)
{
    MediaItem file = GetMediaItemByID(mediaID);

    Stream stream = file.GetMediaStream();
    MemoryStream ms = new MemoryStream();
    stream.CopyTo(ms);

    var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new ByteArrayContent(ms.GetBuffer()) };
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = file.Name + "." + file.Extension };
    result.Content.Headers.ContentType = new MediaTypeHeaderValue(file.MimeType);

    return result;
}

person Duane Boudreau    schedule 22.03.2017    source источник


Ответы (1)


Я не думаю, что использование ms.GetBuffer()) делает то, что вы ожидаете.

Вместо этого попробуйте этот код:

Stream mediaStream = mediaItem.GetMediaStream();
var fileSize = mediaStream.Length;
byte[] buffer = new byte[(int)fileSize];
mediaStream.Read(buffer, 0, (int)mediaStream.Length);
mediaStream.Close();

var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new ByteArrayContent(buffer) };
person Marek Musielak    schedule 22.03.2017
comment
Вы были правы, проблема была в ms.GetBuffer(). Я всегда думал, что это одно и то же, но читая об этом, есть разница. - person Duane Boudreau; 22.03.2017