Страница 1 из 1

SaveDocumentToByteArray() -> Load(byte[]) :(

Добавлено: 06 июн 2014, 15:07
Алексей
Добрый день!

у меня есть WebApi-сервис, в рамках которого рендерится отчет, который потом отдается в выходной поток:

Код: Выделить всё

public async Task<HttpResponseMessage> GetReportById(....)
{
 HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
 ...
 StiReport rpt = ...
 rpt.Render();
 result.Content = new StreamContent(new MemoryStream(rpt.SaveDocumentToByteArray()));
 result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
}
на выходе - корректный отчет (rpt.SaveDocument дает бинарный файл, который корректно открывается стандартным Viewer.exe)

имеется ASP.NET MVC сайт, который потребляет то, что создано WebApi-сервис'ом:

Код: Выделить всё

  HttpClient zone = new HttpClient();
  zone.BaseAddress = new Uri(WebApiZoneBaseAddress);
  zone.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/octet-stream"));
....
  HttpResponseMessage response = zone.GetAsync(uri)
  response.EnsureSuccessStatusCode();
  byte[] rrr = response.Content.ReadAsByteArrayAsync().Result;
в rrr нормально приходит все тот же массив (но правда проверил только лишь его размеры - искажения не проверял - навряд ли там они есть)
далее:

Код: Выделить всё

  public ActionResult GetReportSnapshot()
        {
            ...
            StiReport report = new StiReport();
            ...
            report.Load(rrr);
>>>> breakpoint >>>>>
            return StiMvcViewer.GetReportSnapshotResult(HttpContext, report);
        }
в момент breakpoint в debug'е делаю: report.SaveDocument("путь");
формируется пустой отчет.
report.SaveDocumentToByteArray() дает уже другой довольно короткий массив, похожий на "пустой" отчет.

Вопрос:
что я делаю не так, и как корректно из массива в данной ситуации развернуть и показать созданный где-то "очень далеко" :) отчет?

Дополнение - провел эксперимент:

Код: Выделить всё

StiReport rpt1 = new StiReport();
...
rpt1.Render();
byte[] rrr1 = rpt1.SaveDocumentToByteArray();
StiReport rpt2 = new StiReport();
rpt2.Load(rrr1);
byte[] rrr2 = rpt2.SaveDocumentToByteArray();
rpt2 - после загрузки из массива опять получается пустой отчет,
и если rrr1 ~170K
то rrr2 638 байт

значит я как-то не корректно работаю с отчетом, как надо?

Re: SaveDocumentToByteArray() -> Load(byte[]) :(

Добавлено: 06 июн 2014, 15:33
Aleksey
Здравствуйте,

Пожалуйста, попробуйте использовать метод Render() перед сохранением отчета.

Спасибо.

Re: SaveDocumentToByteArray() -> Load(byte[]) :(

Добавлено: 06 июн 2014, 15:38
Алексей
Aleksey писал(а):Здравствуйте,

Пожалуйста, попробуйте использовать метод Render() перед сохранением отчета.

Спасибо.
я его и использовал. просто в первом блоке кода он не указан.
важно, что в момент исполнения rpt.SaveDocumentToByteArray() сам отчет уже "отрендерен", что подтвердил для себя в отладчике путем сохранения в файл и просмотра с помощью Viewer.exe.

где еще можно копать?

Re: SaveDocumentToByteArray() -> Load(byte[]) :(

Добавлено: 06 июн 2014, 16:28
Aleksey
Здравствуйте,

Тогда вам необходимо загружать отрендеренный отчет, а не шаблон.
Пожалуйста, попробуйте использовать метод LoadDocument() вместо Load().

Спасибо.

Re: SaveDocumentToByteArray() -> Load(byte[]) :(

Добавлено: 06 июн 2014, 16:41
Алексей
Помогло, ОГРОМНОЕ Вам СПАСИБО!

Re: SaveDocumentToByteArray() -> Load(byte[]) :(

Добавлено: 06 июн 2014, 17:20
Aleksey
Здравствуйте,

Всегда рады помочь.

Спасибо.