В предыдущей статье мы рассмотрели простейший пример использования нового продукта от FastReport – FastReport Core. Это был пример для Windows. Теперь же, мы рассмотрим пример для Linux.
Прежде всего для Linux нам потребуются дополнительные библиотеки, которые могут быть не установлены по умолчанию:
На серверных ОС Linux обычно не установлен xserver, который необходим для обработки графики FastReport Core. Поэтому придется его установить. Это может быть, например: Xvfb, VcXsrv или любой другой.
Далее мы еще вернемся к вопросу XServer, а пока создаем приложение ASP.Net Core:
Выбираем Web Application:
Подключаем FastReport Core к проекту посредством NuGet.
Добавляем локальный репозиторий в качестве источника пакетов в настройках NuGet:
Задаем ссылку на локальный репозиторий или папку с пакетом FastReport.2017.4.0-release.nupkg:
Выбираем в выпадающем списке локальный источник пакетов и устанавливаем FastReport.
Открываем на редактирование файл HomeController.cs из папки Controllers. Добавляем несколько дополнительных библиотек в секцию uses:
1 2 3 4 |
using FastReport; using FastReport.Export.Html; using System.IO; using System.Text; |
Редактируем метод Index:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public IActionResult Index() { Report report = new Report(); string report_path = ”Reports”; System.Data.DataSet dataSet = new System.Data.DataSet(); dataSet.ReadXml(report_path + "nwind.xml"); report.Report.RegisterData(dataSet, "NorthWind"); report.Report.Load(Path.Combine(report_path, "Simple List.frx")); report.Prepare(); HTMLExport export = new HTMLExport(); export.Layers = true; using (MemoryStream ms = new MemoryStream()) { export.EmbedPictures = true; export.Export(report, ms); ms.Flush(); ViewData["Report"] = Encoding.UTF8.GetString(ms.ToArray()); ViewData["ReportName"] = "Simple List.frx"; } return View(); |
Так как объект WebReport пока еще не доступен нам в FastReport Core, то используем обычный объект Report. Создаем источник данных и регистрируем его в объекте Report. Загружаем шаблон отчета. Подготавливаем отчет с помощью метода Prepare(). Далее создаем экспорт готового отчета в HTML. Выполняем экспорт в потоке MemoryStream (или в файл). Затем передаем отчет в представление с помощью ViewData или ViewBag.
Теперь переходим к редактированию представления Views -> Index.chtml.
Тут все крайне просто – выводим отчет в формате HTML:
1 2 3 4 5 6 7 |
@{ ViewData["Title"] = "Home Page"; } @if (ViewData.ContainsKey("Report")) { @Html.Raw(ViewData["Report"]) } |
Как я говорил уже ранее, для работы FRCore нужен xserver, которого нет в серверных Linux.
Настройка Linux на примере debian server:
1. Открыть консоль;
2. Обновить apt-get и установить пакеты:
3. Изменить переменную окружающей среды DISPLAY=:99.
В классе Program добавляем два метода. Метод LinuxStart проверяет запущен ли xserver, если да, то закрывает его и создает новый.
Метод StopLinux просто останавливает виртуальный сервер.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
public class Program { static Process xvfb; const string xvfb_pid = "pid.xvfb.fr"; public static void Main(string[] args) { if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) LinuxStart(); BuildWebHost(args).Run(); if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) LinuxStop(); } private static void LinuxStop() { xvfb.Kill(); if (File.Exists(xvfb_pid)) File.Delete(xvfb_pid); } public static void LinuxStart() { if (File.Exists(xvfb_pid)) { string pid = File.ReadAllText(xvfb_pid); try { xvfb = Process.GetProcessById(int.Parse(pid)); xvfb.Kill(); xvfb = null; } catch { } File.Delete(xvfb_pid); } string display = Environment.GetEnvironmentVariable("DISPLAY"); if (String.IsNullOrEmpty(display)) { Environment.SetEnvironmentVariable("DISPLAY", ":99"); display = ":99"; } ProcessStartInfo info = new ProcessStartInfo(); info.FileName = "/usr/bin/Xvfb"; info.Arguments = display + " -ac -screen 0 1024x768x16 +extension RANDR -dpi 96"; info.CreateNoWindow = true; xvfb = new Process(); xvfb.StartInfo = info; xvfb.Start(); File.WriteAllText(xvfb_pid, xvfb.Id.ToString()); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .UseUrls("http://[::]:5000") .Build(); } |
Приложение готово. Запускаем:
Как и в случае с Windows приложением, приложение для Linux получилось таким же простым. Однако требуются некоторые предварительные настройки самой операционной системы для работы с .Net Core.