Не работает замещение метода из ReportHelper под safari
Здравствуйте! Поймали необъяснимый баг.
Есть C# в котором замещается метод CreateReport из ReportHelper
Приведу пример:
using System; using System.Collections.Generic; using System.ServiceModel; using System.ServiceModel.Web; using System.Text.RegularExpressions; using System.Web; using Terrasoft.Common; using Terrasoft.Core; using Terrasoft.Core.Factories; using Terrasoft.Reports; using System.Web.Script.Serialization; using Terrasoft.Core.Entities; namespace Terrasoft.Configuration.ReportService { [Terrasoft.Core.Factories.Override] class OnellectReportHelper : ReportHelper { public override string CreateReport(string entitySchemaUId, string reportSchemaUId, string templateId, string recordId, string reportParameters, bool convertInPDF) { string key = base.CreateReport(entitySchemaUId, reportSchemaUId, templateId, recordId, reportParameters, convertInPDF); string reportName = "Метод генерации названия файла"; if (!reportName.IsNullOrEmpty()) { object reportObj = UserConnection.SessionData[key]; var report = (ReportData)reportObj; report.Caption = Uri.EscapeDataString(reportName); UserConnection.SessionData[key] = report; } return key; } } }
Так вот под Windows проблем нет, все отрабатывает корректно, но некоторые клиенты стали жаловаться, что именование файлов работает как в коробке. Выяснилось, что они используют Safari. Если запустить генерацию печатных форм в Chrome, то название формируется согласно замещающему методы.
Не могу понять, куда копать. Mac-а для отладки под рукой нет. По идее код можно вставить на любой среде и тогда все печатные формы должны выгружаться с названием из переменной reportName. Может кто-то проверит под маком и Safari, повторится ли баг?
Нравится
Мы для тестов под Mac использовали облачный сервис. Например, https://www.macincloud.com
Здраствуйте, попробуйте вместо килирицы использовать латиницу, возможно проблема в кодировке.
Я нашел проблему. Почему-то Safari берет название не из метаданных файла, а из caption, которое было сгенерировано на фронте. Метод downloadReport из PrintReportUtilities, передается caption с фронта.
downloadReport: function(caption, key) { var report = document.createElement("a"); report.href = "../rest/ReportService/GetReportFile/" + key; report.download = caption; if (this.Ext.isIE) { report.target = "_blank"; } document.body.appendChild(report); report.click(); document.body.removeChild(report); }
Получилось обойти это, изменив объект printForm в методе generatePrintForm в BasePageV2
generatePrintForm: function(printForm) { printForm.$Caption = "Имя файла"; return this.callParent(arguments); }
Правда с получением названия отчета из бекэнда пришлось повозиться, так и не смог по нормальному вызвать callParent внутри callService, т.к. название отчета получал через сервис. Забил на это дело с вызовом callParent и полностью скопировал код метода generatePrintForm из PrintReportUtilities, без всякого наследования...возможно это аукнется в одном из обновлений, но таков путь...