Не работает замещение метода из 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, без всякого наследования...возможно это аукнется в одном из обновлений, но таков путь...