1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/dotnetchina-Furion

03.03.2025 18:33
GitLife Service Account

Логгинговый модуль является обязательной частью любого приложения, можно сказать, что это один из самых важных компонентов! В сообществе .NET есть логгеры Log4Net, NLog, Serilog и другие, все они являются отличными открытыми проектами.

Однако из-за долгой истории этих логгеров, внутри них поддерживаются множество версий .NET, а функционал со временем становится очень мощным и сложным. При использовании в реальных проектах было замечено, что конфигурация каждого из логгеров не всегда удобна, особенно с точки зрения простоты использования.

Furion как полифункциональный фреймворк, ранее не предоставлял достаточно мощного логгера для удовлетворения потребностей разработчиков, поэтому рекомендовал использовать сторонние компоненты, такие как Serilog, что привело к невозможности реализовать пользовательские функции и увеличению затрат на поддержание.

На этот раз Furion больше не будет делать уступок, полностью переоптимизировал логгинговый модуль, обеспечивая полную автономность управления логами и предоставление всем необходимым функциям логирования для разработчиков!

Furion-разработчики, пришло время "заменить" сторонние логгеры, давайте вместе создадим более совершенные логгеры! 🍖

  • Новые возможности

    • [Переоптимизация] Логгингового модуля, встроенные функции записи в консоль, файлы и базы данных, теперь нет необходимости использовать сторонние логгеры! Исходный код логгера
  • Разрушение границ

    • [Переоптимизация] Логгингового модуля, встроенные функции записи в консоль, файлы и базы данных, теперь нет необходимости использовать сторонние логгеры! Исходный код логгера
  • Документация

    • [Обновление] Документация по логированию
  • Основные моменты выпуска

  1. Лёгкий в использовании и мощный логгинговый модуль
// Запись в файл
services.AddFileLogging("logs/application.log");

// Запись в базу данных
services.AddDatabaseLogging<DatabaseLoggingWriter>();

Подробнее о логировании

Последнее сообщение коммита: 😊 Furion v3.9.0 发布,兄弟们可以不用第三方日志组件了!
03.03.2025 18:32
GitLife Service Account
  • Новые возможности

    • [Добавлено] Возможность получения свойства ErrorCode для объектов ExceptionMetadata и ValidationMetadata #I5GJ6D
    • [Добавлено] Настройка закодированного URL при удалённых запросах с помощью [Get(WithEncodeUrl = false)] и WithEncodeUrl(false) #I5GOBC
    • [Добавлено] Улучшенная статическая методом SecurityReadJwtToken('token') для чтения и анализа токена Token 574eeb6
  • Разрушительные изменения

    • [Обновление] Обновление всех .NET зависимых пакетов до версии 6.0.7
    • [Переработка] Логика обновления JWT токена #I5GXML 574eeb6
  • Исправления ошибок

    • [Исправлено] Проблема отображения нескольких одноимённых шаблонов (EFCore и SqlSugar) в Rider #I518
    • [Исправлено] Проблема работы UnitOfWork в EFCore #I5H0T3
    • [Исправлено] Проблема потери исторических значений при обновлении JWT токена, если он содержит массивы #I5GXML
    • [Исправлено] Проблема установки WithEncodeUrl в [HttpMethod] #I5GXML
    • [Исправлено] Проблема получения конфигурационных файлов EFCore при использовании Serve.Run() #I5GZ0F
    • [Исправлено] Проблема срабатывания Oops.Bah в глобальном обработчике исключений #I5H47S
  • Другие изменения

    • [Изменено] Изменение логики по умолчанию для многоязычной системы, теперь можно использовать без конфигурирования #I5GRD9 5077c5d
    • [Улучшено] Оптимизация производительности Swagger
    • [Изменено] Изменение ограничений типа TDocument для хранилища MongoDB 3f49055
  • Документация

    • [Обновлено] Документация по удалённым запросам и записи журналов

03.03.2025 18:32
GitLife Service Account
  • Новые возможности

    • [Добавлено] Возможность получения свойства ErrorCode для объектов ExceptionMetadata и ValidationMetadata #I5GJ6D
    • [Добавлено] Настройка закодированного URL при удалённых запросах, [Get(WithEncodeUrl = false)] и WithEncodeUrl(false) #I5GOBC
  • Другие изменения

    • [Изменено] Логика по умолчанию для работы с несколькими языками, теперь можно использовать без конфигурации любого языка, ранее версии выдавали ошибку #I5GRD9 5077c5d
  • Документация

    • [Обновлено] Документация по удалённым запросам
Последнее сообщение коммита: 😊 发布 v3.8.0 版本,改进远程请求和多语言
03.03.2025 18:31
GitLife Service Account
  • Новые возможности

    • [Добавлено] По умолчанию конфигурация WithExposedHeaders включает заголовки access-token и x-access-token 42ebdfd
    • [Добавлено] В шаблоне по умолчанию активирован метод логгирования HTTP-запросов app.UseHttpLogging() 42ebdfd
  • Документация

    • [Добавлено] Документация по прокси-запросам для Vue, React и Angular
    • [Обновлено] Документация по CORS, нормализации, конфигурации и логам
Последнее сообщение коммита: 😁 发布 v3.7.0 版本,改进跨域配置
03.03.2025 18:31
GitLife Service Account
  • Новые возможности

    • [Добавлено] Serve.Run() — минималистический режим работы сервера, позволяющий легко начать работу с нуля. 95cac5b
    • [Добавлено] TP.Wrapper(...) — расширение метода для создания нормализованной шаблонной записи лога 427999a
    • [Поддержка] Контроллер проекта типа <Project Sdk="Microsoft.NET.Sdk"> fb08a65
  • Разработки

    • [Поддержка] Контроллер проекта типа <Project Sdk="Microsoft.NET.Sdk"> fb08a65
    • [Добавлено] Serve.Run() — минималистический режим работы сервера, позволяющий легко начать работу с нуля. 95cac5b
  • Документация

    • [Добавлено] Документация Serve.Run()
    • [Добавлено] Документация HttpContext
    • [Добавлено] Документация GlobalUsings
    • [Добавлено] Документация глобального статического класса TP
  • Основные достижения в выпуске

  1. Быстрое начало работы
Serve.Run();

[DynamicApiController]
public class HelloService
{
    public string Say()
    {
        return "Привет, Furion";
    }
}

Не удивлены ли вы?

Последнее сообщение коммита: 😊 v3.6.0 版本发布,真正划时代的版本,未来已来
03.03.2025 18:31
GitLife Service Account
  • Новые возможности

    • [Добавлено] Поддержка пользовательских ключей в свойствах опций [MapSettings("key")] #I5B2HN
    • [Добавлено] Поддержка типа перечисления для идентификатора событий EventBus 2f328aa
    • [Добавлено] Переопределение методов публикации PublishAsync и PublishDelayAsync в EventBus 2f328aa
    • [Добавлено] Расширение методов EventBus: Enum.ParseToString() и String.ParseToEnum() 2f328aa
    • [Добавлено] Шаблонизаторы Furion и SqlSugar 🆕🆕🆕 8d9293d
    • [Добавлено] Глобальная конфигурация Dapper с использованием делегата #I5AYFX
  • Другие изменения

    • [Изменено] Обновление файлов axios-utils.ts и angular-utils.ts, добавление проверки времени для перезапроса токена 82f89bd
    • [Улучшено] Улучшение производительности загрузки Swagger с помощью <inheritoc /> 5f06880
      Yöntem adı: [Ekleme] Ekleme şablonu GlobalUsings.cs
  • Документация

    • [Добавлено] Документация для шаблонизаторов Furion и SqlSugar
    • [Обновлено] Обновление документов по событийному байсу, опциям, мгновенной связи, переходу от .NET5 к .NET6 и внедрению зависимостей
  • Основные достижения

  1. Поддержка типов перечисления для идентификатора событий EventBus
[EventSubscribe("TO:DO")]  // строковый тип
public async Task EventHandler1(EventHandlerExecutingContext context)
{
    // ...
}

[EventSubscribe(YourEnum.Some)] // перечисляемый тип
public async Task EventHandler2(EventHandlerExecutingContext context)
{
    var eventEnum = context.Source.EventId.ParseToEnum(); // преобразование идентификатора события в объект перечисления
    // ...
}
  1. Проще вызывать методы публикации EventBus
// старая версия
await _eventPublisher.PublishAsync(new ChannelEventSource("ToDo:Create", name));

// новая версия
await _eventPublisher.PublishAsync("ToDo:Create", name);
await _eventPublisher.PublishAsync(YourEnum.Some); // также поддерживается перечисляемый тип
  1. Пользовательская конфигурация ключей для опций
"AppInfo": {
    "Name": "Furion",
    "Version": "1.0.0",
    "Company_Name": "Baiqian" // может отличаться от имени свойства
}
public class AppInfoOptions : IConfigurableOptions
{
    public string Name { get; set; }
    public string Version { get; set; }

    [MapSettings("Company_Name")] // поддерживает пользовательскую конфигурацию
    public string Company { get; set; }
}
Последнее сообщение коммита: 😁 发布 v3.5.0 版本,唯一没有 bug 修复的版本
03.03.2025 18:30
GitLife Service Account
  • Новые возможности

    • [Добавлено] Новый функционал нормализации файла EnableAllGroups, который позволяет объединять несколько групп в одну 9277b98
    • [Добавлено] Клиентская библиотека angular-utils, предназначенная для решения проблем с прокси-интерфейсами проектов angular 6c70584
    • [Добавлено] Поддержка более подробного описания отдельных интерфейсов в Swagger (поддерживает html) e5e1db0
    • [Добавлено] Поддержка метки [Obsolete] для помечивания устаревших интерфейсов в Swagger e5e1db0
  • Разрешенные изменения

    • [Интегрировано] По умолчанию поддерживаются кодировки GBK, Windows-1252, Shift-JIS, GB2312 и другие c456ecb
  • Устранение ошибок

    • [Исправлено] Проблема с использованием <inheritdoc /> через сборки 3b9d39c
    • [Исправлено] Проблема с отображением Swagger после версии v3.3.1 6763352
    • [Исправлено] Проблема с поддержкой кодировок GBK, GB2312 и других государственных стандартов при выполнении удалённых запросов, работе с JSON и Web страницами c456ecb
    • [Исправлено] Проблема с автоматическим преобразованием кодировки при указании Content-Type: charset= в ответах на запросы c456ecb
  • Другие изменения

    • [Добавлено] Поддержка нескольких клиентских конфигураций в файлах axios-utils.ts и angular-utils.ts
  • Документация

    • [Добавлено] Документация по GlobalUsings адрес документа
    • [Обновлено] Обновление нормализованной документации, документации по Worker Service и динамического API
  • Основные достижения этого выпуска

  1. Активация функции All Groups

Часто нам требуется лучше организовать группы для удобства управления интерфейсами. Для этого была добавлена новая настройка:

{
  "SpecificationDocumentSettings": {
    "EnableAllGroups": true
  }
}
  1. Пометка методов как устаревших

Если какой-то метод стал устаревшим, его можно пометить аннотацией [Obsolete]. Например:

[Obsolete("Метод GetName() устарел, используйте вместо него GetFrameworkName().")]
public string GetName()
{
  return nameof(Furion);
}

[Obsolete]
public string Other()
{
  // ...
}

Пример использования

  1. Более подробное описание интерфейсов

В этом выпуске был добавлен атрибут Description в аннотацию [ApiDescriptionSettings], что позволяет добавлять больше информации к описанию интерфейса. Например:

[ApiDescriptionSettings(Description = "Это описание, которое показывает больше контента <button>Кнопка</button>")]
public string Add()
{
  //...
}

Пример использования

Последнее сообщение коммита: 😁 发布 v3.4.0 版本,支持 GBKGB2312 等国标编码
03.03.2025 18:29
GitLife Service Account

  • Новые возможности

    • [Добавлено] Автоматическое распознавание типа контента (Content-Type) и MIME при удалённой загрузке файла #I57ZMN
    • [Добавлено] Поддержка установки типа контента (Content-Type) и кодировки (Encoding) в методах удалённого запроса #I57ZMN
    • [Добавлено] Получение типа контента (Content-Type) и MIME по имени файла #8f78184
    • [Добавлено] Поддержка авторизации доступа в нормализованной документации #32aa3b6
    • [Добавлено] Поддержка синтаксиса inheritdoc в комментариях кода и нормализованной документации ❤️️️️ #159A6W
    • [Добавлено] Библиотека инструментов для запросов Vue2/3, React 16.8+, Angular 9+ и реализация прокси API на стороне сервера axios-utils
  • Разрушительные изменения

    • [Добавлено] Поддержка синтаксиса inheritdoc в комментариях кода и нормализованной документации ❤️️️️ #159A6W
  • [Обновлено] Все зависимости .NET до версии v6.0.5

  • Исправление ошибок

    • [Исправлено] Ошибка получения номера строки и пустого файла после переопределения глобального исключения Exception #I53EGM
    • [Исправлено] Ошибка пустого вызова делегата при передаче контекста базы данных #I519AW
    • [Исправлено] Проблема с методом расширения Render, который возвращает void, а должен возвращать string Github-#99
    • [Исправлено] Проблема с отсутствием Content-Type при удалённой загрузке файла #I57ZMN
  • Другие изменения

    • [Изменено] Введение механизма GlobalUsings для снижения объёма кода #7e9cc1c
    • [Изменено] Настройка предварительной проверки CORS, если она не установлена, то значение по умолчанию — 24 часа 4a11e7c
    • [Улучшено] Производительность рефлексии в движке представлений
  • Документация

    • [Добавлено] Документация по сериализации объектов Clay в JSON
    • [Добавлено] Документация по шифрованию JWT на клиентской стороне
    • [Добавлено] Документация по преобразованию массива байтов в URL
    • [Обновлено] Документация по вторичному виртуальному каталогу, удалённым запросам, загрузке файлов, безопасности и нормализации
  • Основные достижения

    • ❤️️️️ Получение типа MIME или Content-Type по имени файла
var success = FS.TryGetContentType("image.png", out var contentType);  // image/png
  • ❤️️️️ Поддержка конфигурации Swagger для доступа после входа
{
  "SpecificationDocumentSettings": {
    "LoginInfo": {
      "Enabled": false,
      "CheckUrl": "URL для проверки",
      "SubmitUrl": "URL для отправки"
    }
  }
}

Подробнее

  • ❤️️️️ Поддержка наследования комментариев кода и Swagger
/// <inheritdoc cref="ITestInheritdoc" />
public class TestInheritdoc : ITestInheritdoc, IDynamicApiController
{
    /// <inheritdoc cref="ITestInheritdoc.GetName"/>
    public string GetName()
    {
        return "Furion";
    }
}

/// <summary>
/// Тест наследования комментариев
/// </summary>
public interface ITestInheritdoc
{
    /// <summary>
    /// Получение имени
    /// </summary>
    /// <returns></returns>
    string GetName();
}

Пример

Подробнее

Последнее сообщение коммита: 😊 通过 Jenkins 发布 v3.3.1 版本,重大改进
03.03.2025 18:27
GitLife Service Account

Версия 3.3.0 (текущая версия)

  • Новые возможности

    • [Добавлено] Автоматическое распознавание типа содержимого (Content-Type) и MIME при удалённой загрузке файла I57ZMN
    • [Добавлено] Поддержка установки типа содержимого (Content-Type) и закодированной формы (Encoding) в методах удалённого запроса I57ZMN
  • Основные изменения

    • [Обновлено] Все зависимости .NET до версии v6.0.5
  • Исправление ошибок

    • [Исправлено] Проблема получения номера строки ошибки после настройки глобального исключения Exception #I53EGM
  • [Исправлено] Проблема с пустым делегатом при передаче контекста базы данных, вызывающая ошибку отсутствующего объекта #I519AW

  • [Исправлено] Проблема с методом расширения Render шаблонов строковых моделей, который возвращает void, а должен возвращать string

  • [Исправлено] Проблема с пустыми условиями при удалённой загрузке файла (причина — отсутствие Content-Type) I57ZMN

  • Другие изменения

    • [Улучшено] Производительность рефлексии движка представлений
  • Документация

    • [Обновлено] Документация по вторичному виртуальному каталогу, удалённым запросам, загрузке файлов и безопасной авторизации
    • [Добавлено] Документация по преобразованию массива байтов (byte[]) в URL
03.03.2025 18:27
GitLife Service Account
  • Новые возможности

    • [Добавлено] Расширение метода IFormFile.ToByteArray() da69640
    • [Добавлено] Нормализация документации ServeDir, включает поддержку быстрого переключения между первичной и вторичной директориями (IIS) 8718392
  • Разработки

    • [Обновлено] Все зависимости до последней версии
    • [Переработка] Основной код модуля внедрения зависимостей, удалены регистрации сервисов с использованием рефлексии, что снижает затраты на производительность рефлексии acdb315
  • Исправление ошибок

    • [Исправлено] Проблема с генерацией фронтенд-кода при типе schema как C# Object в Swagger Swagger официальный Issue 1a25274
    • [Исправлено] Проблема абсолютного пути лога при публикации Worker Service как Windows Services. Спасибо @jacoat !467
    • [Исправлено] Проблема 404 при различной конфигурации вторичного виртуального каталога Nginx и IIS 8718392
    • [Исправлено] Проблема незаполненного исключения при отсутствии инициализации OnRequestFailed в модуле удалённых запросов #I54PK7
    • [Исправлено] Проблема с ошибкой Not found Method при использовании рефлексии в модуле внедрения зависимостей #I546L1
  • Другие изменения

    • [Изменено] Логика обработки исключений после неудачного выполнения задачи, спасибо @chengxiaosheng !463
  • Документация

    • [Обновлено] Документация по расписанию задач и журналам
    • [Добавлено] Документация по загрузке/скачиванию файлов, включая одиночные/множественные файлы, Base64 и Byte[]

Последнее сообщение коммита: 😊 通过 Jenkins 自动发布 v3.2.0 版本,修复现有不少 bug
03.03.2025 18:26
GitLife Service Account
  • Новые возможности

    • [Добавлено] Поддержка сжатия данных через GZip для удалённых запросов #I506S5
  • Исправление ошибок

    • [Исправлено] Ошибка в модуле маскирования данных, замена последнего совпадения вместо всех #I4YFA0
    • [Исправлено] Проблема с отображением некорректных символов при возврате строки из удалённого запроса в некоторых случаях #I50GBD
    • [Исправлено] Недействие конфигураций AllowNullValue и AllowEmptyString в атрибуте [DataValidate] #I4ZZBE
  • Документация

    • [Документация] Документация по удалённым запросам
Последнее сообщение коммита: 👍 通过 Jenkins 自动发布 v3.1.3 版本
03.03.2025 18:26
GitLife Service Account
  • Новые возможности

    • [Добавлено] Обработка аномальных HTTP-статусных кодов в модуле удалённых запросов !462
    • [Добавлено] Поддержка малых вершинных путей в динамических WebAPI #I4W1R4
    • [Добавлено] Набор методов SendAsByteArrayAsync, поддерживающих возврат данных типа byte[] !452
  • Разработки

    • [Обновление] Все зависимости .NET6 были обновлены до последней версии NuGet v6.0.3
  • Исправления ошибок

    • [Исправлено] Проблема с двумя уровнями виртуального каталога при использовании .NET6 WebApplication #I4UZLM #I4PZ0C
    • [Исправлено] Проблема с проверкой даты, которая не поддерживает 2022-03-01 0:00:00 (теперь поддерживается часовой диапазон 0 и 00) #I4Y3NT
    • [Исправлено] Проблема с приоритетами конфигураций окружения и файловых конфигураций
  • Другие изменения

    • [Устарело] Расширение пакета Furion.Extras.Logging.Serilog для расширения IWebHost помечено как устаревшее
  • Документация

    • [Документация] Улучшение опыта использования документов, добавлена навигация через хлебные крошки, перезаписана система кэширования документов, увеличена скорость доступа к документам
    • [Документация] Обновление документации по динамическим API, конфигурациям и удалённым запросам
    • [Документация] Обновление документации по второму уровню виртуальных каталогов
  • Основные достижения этого выпуска

  1. Добавлена поддержка малых вершинных путей в динамическом WebApi:
{
    "DynamicApiControllerSettings": {
        "LowercaseRoute": false,
        "KeepName": true,
        "AsLowerCamelCase": true
    }
}
  1. Поддержка конфигурирования второго уровня виртуальных каталогов в режиме .NET6 WebApplication:
app.UseVirtualPath(app =>
{
    app.UseInject(string.Empty);  // Внимание: string.Empty — это пример, можно использовать любое значение, см. раздел «Быстрый старт за минуту»
    app.MapControllers();
});
Последнее сообщение коммита: 😍 通过 Jenkins 自动发布 v3.1.0 版本,修复大量 bug
03.03.2025 18:25
GitLife Service Account
  • Исправленные проблемы

    • [Исправлено] Включение нормализации результатов и использование глобальных исключений привело к ошибке при прохождении через фильтр OnSucceeded баг #I4DTVL
    • [Исправлено] .NET5.0.5+ и .NET6 Microsoft изменил внутреннюю реализацию проверки [ApiController], теперь в случае провала возвращается тип IActionResult #I4ISOK
    • [Исправлено] Неправильная работа EFCore 6.0 с SqlServer 2005+ #I4ILA5
    • [Исправлено] В .NET6 проблема с получением конфигурационного объекта, если он отсутствует, возвращает null, а в .NET5 — начальный объект 94ae4d
    • [Исправлено] Ошибка передачи параметров типа Clay в команду Sql #I4D21Q
    • [Исправлено] Баг в функционале периодических задач Cron #I4OJQI
Последнее сообщение коммита: 🧒 发布 v3.0.6,2.20.7 版本,修复定时任务 bug
03.03.2025 18:25
GitLife Service Account

Furion v3.x версия построена на .NET 6.

Последнее сообщение коммита: 🥽 通过 Jenkins 自动发布 v3.0.0 文档
03.03.2025 18:25
GitLife Service Account
  • Основные изменения

    • [Переработка] модуля EventBus, используя метод Jaina
  • Исправленные ошибки

    • [Исправление] Исключение при удаленной отправке файла 0c0752
    • [Исправление] Недоступность конфигурации переменной окружения ASPNETCORE_HOSTINGSTARTUPASSEMBLIES при запуске фреймворка !438
    • [Корректировка] Опечатка в слове ExceptInterfaces в атрибуте зависимости InjectionAttribute !436
  • Другие изменения

    • [Оптимизация] Код атрибута зависимости InjectionAttribute !435
  • Документация

    • [Добавление] Новая документация для событийной шины
Последнее сообщение коммита: 😮 通过 Jenkins 自动发布 v2.20.0 版本
03.03.2025 18:24
GitLife Service Account
  • Новые возможности

    • [Добавлено] Очередной слушатель задач ISpareTimeListener #I468Q1
    • [Добавлено] Поддержка выполнения SQL с параметрами типа JsonElement 61985d6
    • [Добавлено] Конфигурация Swagger с использованием перечислений и фильтром сортировки меток #I46LON !404
    • [Добавлено] Поддержка типов данных application/octet-stream при удалённых запросах d9bad03
  • Исправление ошибок

    • [Исправлено] Проблема с отсутствием корневого сервиса в окружении PM, вызывающая пустую ошибку при выполнении команды Add-Migration через Scoped.Create в EFCore 0853e74
    • [Исправлено] Проблема с постоянным хранением ошибок после завершения задачи, исправлено автоматическое очистка прошлых ошибок при успешном выполнении 197a62b
    • [Исправлено] Некорректный код расширения Jwt, приводящий к недействительности IOptions #I46LUP
    • [Исправлено] Проблема с отсутствием значений в фильтре Schema перечислений Swagger #I46LON !404
    • [Исправлено] Проблема с преобразованием неприспособленных типов перечислений в Swagger #I46QJ9
    • [Исправлено] Проблема с генерацией ошибки формата IL при повторной загрузке компилированного шаблона DLL в движке представлений ff52d38
    • [Исправлено] Проблема с невозможностью освобождения объекта обработчика при чтении читателя канала 10f4a90
    • [Исправлено] Проблема с отсутствием логирования в службе работников c482548
    • [Исправлено] Проблема с отправкой запросов типа multipart/form-data для загрузки файлов в WeChat Mini Program d9bad03
    • [Исправлено] Проблема с некорректной работой контекста единицы работы в некоторых случаях 006d439
    • [Исправлено] Проблема с некорректным отображением значений перечислений в запросе GET в схеме Swagger fb72fd7
Последнее сообщение коммита: 🍞 通过 Jenkins 自动发布 v2.19.0 版本
03.03.2025 18:23
GitLife Service Account

Просмотреть журнал обновлений: https://dotnetchina.gitee.io/furion/docs/upgrade

Последнее сообщение коммита: 📁 通过 Jenkins 自动化发布 v2.18.0 文档
03.03.2025 18:23
GitLife Service Account
  • Новые возможности

    • [Добавлено] Поддержка нормализованной обработки в контроллерах MVC #I427Z2
    • [Добавлено] Вызов бизнес-исключения с помощью throw Oops.Bah() (код состояния 400)
    • [Добавлено] Нормализация конфигурационных опций JSON через UnifyResultSettings #I42NY7
    • [Добавлено] Возможность настройки имени файла конфигурации для многоязычности #I434YJ
  • Разрушительные изменения

    • [Изменено] Изменение параметров IUnifyResultProvider для нормализованного результата (разрушительные изменения) #I427Z2
using Furion.DataValidation;
using Furion.DependencyInjection;
using Furion.UnifyResult.Internal;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Threading.Tasks;

namespace Furion.UnifyResult
{
    /// <summary>
    /// RESTful стилизованный ответ
    /// </summary>
    [SuppressSniffer, UnifyModel(typeof(RESTfulResult<>))]
    public class RESTfulResultProvider : IUnifyResultProvider
    {
        /// <summary>
        /// Метод описания
        /// </summary>
        /// <param name="context"></param>
        /// <param name="metadata"></param>
        /// <returns></returns>
        public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
        {
            return new JsonResult(RESTfulResult(metadata.StatusCode, errors: metadata.Errors));
        }

        /// <summary>
        /// Успешный ответ
        /// </summary>
        /// <param name="context"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public IActionResult OnSucceeded(ActionExecutedContext context, object data)
        {
            return new JsonResult(RESTfulResult(StatusCodes.Status200OK, true, data));
        }

        /// <summary>
        /// Ответ при проваленной проверке
        /// </summary>
        /// <param name="context"></param>
        /// <param name="metadata"></param>
        /// <returns></returns>
        public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata)
        {
            return new JsonResult(RESTfulResult(StatusCodes.Status400BadRequest, errors: metadata.ValidationResult));
        }

        /// <summary>
        /// Ответ для конкретного кода состояния
        /// </summary>
        /// <param name="context"></param>
        /// <param name="statusCode"></param>
        /// <param name="unifyResultSettings"></param>
        /// <returns></returns>
        public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings)
        {
            // Установка кода состояния ответа
            UnifyContext.SetResponseStatusCodes(context, statusCode, unifyResultSettings);

            switch (statusCode)
            {
                // Обработка кода состояния 401
                case StatusCodes.Status401Unauthorized:
                    await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: "401 Unauthorized"),
                        App.GetOptions<JsonOptions>()?.JsonSerializerOptions);
                    break;
                // Обработка кода состояния 403
                case StatusCodes.Status403Forbidden:
                    await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: "403 Forbidden"),
                        App.GetOptions<JsonOptions>()?.JsonSerializerOptions);
                    break;
                default: break;
            }
        }

        /// <summary>
        /// Возвращает RESTful стилизованный результат
        /// </summary>
        /// <param name="statusCode"></param>
        /// <param name="succeeded"></param>
        /// <param name="data"></param>
        /// <param name="errors"></param>
        /// <returns></returns>
        private static RESTfulResult<object> RESTfulResult(int statusCode, bool succeeded = default, object data = default, object errors = default)
        {
            return new RESTfulResult<object>
            {
                StatusCode = statusCode,
                Succeeded = succeeded,
                Data = data,
                Errors = errors,
                Extras = UnifyContext.Take(),
                Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
            };
        }
    }
}
  • Устранение ошибок

    • [Исправлено] Проблема с возвратом объекта new Json({}) равного null после включения нормализованной обработки в контроллер MVC #I4354S
  • Другие изменения

    • [Оптимизация] Дополнительная работа над внутренним дизайном многоязычности, отмена необходимости создания пустого класса Lang.cs #I434YJ
    • [Оптимизация] Улучшение производительности MiniProfiler за счет снижения количества ненужных слушателей
Последнее сообщение коммита: 📁 通过 Jenkins 自动化发布 v2.16.0 文档
03.03.2025 18:22
GitLife Service Account
  • Новые возможности

    • [Добавлено] статический метод Db.GetDbRepository<定位器>() #I41MZP
    • [Добавлено] конфигурационные опции по умолчанию для сериализации при удалённых запросах #I41PBW
    • [Добавлено] поддержка MVC контроллеров для нормализованной обработки #I427Z2
  • Разрушительные изменения

    • [Изменено] параметры возвращаемого значения IUnifyResultProvider нормализации (разрушительные изменения) #I427Z2

Новый версионный подход к созданию нормализованных результатов

using Furion.DataValidation;
using Furion.DependencyInjection;
using Furion.UnifyResult.Internal;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Threading.Tasks;

namespace Furion.UnifyResult
{
    /// <summary>
    /// RESTful стилизованный ответ
    /// </summary>
    [SuppressSniffer, UnifyModel(typeof(RESTfulResult<>))]
    public class RESTfulResultProvider : IUnifyResultProvider
    {
        /// <summary>
        Yöntem: Возврат ошибки
        /// </summary>
        /// <param name="context"></param>
        /// <param name="metadata"></param>
        /// <returns></returns>
        public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
        {
            return new JsonResult(RESTfulResult(metadata.StatusCode, errors: metadata.Errors));
        }

        /// <summary>
        Yöntem: Успешный возврат
        /// </summary>
        /// <param name="context"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public IActionResult OnSucceeded(ActionExecutedContext context, object data)
        {
            return new JsonResult(RESTfulResult(StatusCodes.Status200OK, true, data));
        }

        /// <summary>
        Yöntem: Возврат ошибки проверки данных
        /// </summary>
        /// <param name="context"></param>
        /// <param name="metadata"></param>
        /// <returns></returns>
        public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata)
        {
            return new JsonResult(RESTfulResult(StatusCodes.Status400BadRequest, errors: metadata.ValidationResult));
        }

        /// <summary>
        Yöntem: Возврат специального статусного кода
        /// </summary>
        /// <param name="context"></param>
        /// <param name="statusCode"></param>
        /// <param name="options"></param>
        /// <returns></returns>
        public async Task<IActionResult> OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultStatusCodesOptions options)
        {
            // Установка статусного кода ответа
            UnifyContext.SetResponseStatusCodes(context, statusCode, options);

            switch (statusCode)
            {
                // Обработка статусного кода 401
                case StatusCodes.Status401Unauthorized:
                    await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: "401 Unauthorized"), App.GetOptions<JsonOptions>()?.JsonSerializerOptions);
                    break;
                // Обработка статусного кода 403
                case StatusCodes.Status403Forbidden:
                    await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: "403 Forbidden"), App.GetOptions<JsonOptions>()?.JsonSerializerOptions);
                    break;
                default: break;
            }
        }

        /// <summary>
        Yöntem: Возвращает стилизованный RESTful результат
        /// </summary>
        /// <param name="statusCode"></param>
        /// <param name="succeeded"></param>
        /// <param name="data"></param>
        /// <param name="errors"></param>
        /// <returns></returns>
        private static RESTfulResult<object> RESTfulResult(int statusCode, bool succeeded = default, object data = default, object errors = default)
        {
            return new RESTfulResult<object>
            {
                StatusCode = statusCode,
                Succeeded = succeeded,
                Data = data,
                Errors = errors,
                Extras = UnifyContext.Take(),
                Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
            };
        }
    }
}
  • Устранение проблем

    • [Исправлено] баг с автоматическим сканированием интерфейсов для внедрения зависимостей и получением первого найденного интерфейса #I41D1M
    • [Исправлено] проблема реализации IRepository<TEntity> вместо IRepository<TEntity, TDbContextLocator> #I41MZP
    • [Исправлено] проблема дефолтной сериализации при удалённых запросах #I41PBW
    • [Исправлено] проблема пустых исключений при работе с многими арендаторами AppDbContext.Tenant #I421DA
    • [Исправлено] проблема блокировки задач Worker Service при использовании нескольких Worker #I421DA
    • [Исправлено] проблема часового пояса при автоматическом обновлении JWT для пользователей за границей #I41UB1 82a79cc
  • Другие изменения

    • [Оптимизация] система запуска теперь быстрее, размер снижён с 106М до 84М
    • [Оптимизация] много внутренних кодов были оптимизированы, размер пакета снижен с 391КБ до 350КБ (версия без комментариев всего 64КБ)

Последнее сообщение коммита: 📁 通过 Jenkins 自动化发布 v2.15.0 文档
03.03.2025 18:20
GitLife Service Account
  • Новые возможности

    • [Добавлено] Возможность использования простых шаблонов строк с поддержкой удалённых запросов, модулей баз данных, логирования, событийной шины, планировщика задач, исключений и проверки данных #I402BL
    • [Добавлено] Нормализация обработки состояния HTTP 404 по умолчанию #I408F5
    • [Добавлено] Поддержка асинхронных методов в объявлении ISpareTimeWorker для планировщиков задач #I40KWR
    • [Добавлено] Автоматическое конфигурирование вторичного виртуального каталога !354
  • Разрушительные изменения

    • [Обновление] Зависимость фреймворка SDK обновлена до версии .NET 5.0.8
    • [Удалено] Удаление статического метода Db.GetNewDbContext() #I400BK
    • [Удалено] Удаление расширения временной таблицы модуля баз данных #I405HI
    • [Изменено] Изменение параметра интерфейса IJsonSerializerProvider, добавлен новый параметр inherit #I3ZQU5
    • [Изменено] Переименование конфигурации AppSettings параметра LogEntityFrameworkCoreSqlExecuteCommand в OutputOriginalSqlExecuteLog #I40VVE
  • Исправления ошибок

    • [Исправлено] Проблема границ значений задач в сервисах Worker приводящая к пропуску одноразовых задач #I405NI
      Yöntem adı GetNewDbContext
    • [Исправлено] Ошибка отсутствия сканирования сборок после самостоятельной публикации сервисов Worker #I3ZH3X
    • [Исправлено] Исключение при передаче пустого адреса запроса RequestUrl при использовании клиента Client для удалённых запросов #I40BC6
    • [Исправлено] Исключение при нормализации результата и изменении состояния HTTP вне короткого пути #I408F5
  • Другие изменения

    • [Оптимизация] Улучшение производительности парсинга службы через App.GetServiceProvider(type) #I40KXN
    • [Изменено] Увеличение размера буферизации файла потока по умолчанию для движков представлений с 4096 до 8192 #I40KH5
Последнее сообщение коммита: 🤢 remove AppExtra.cs inner class.
1
https://api.gitlife.ru/oschina-mirror/dotnetchina-Furion.git
git@api.gitlife.ru:oschina-mirror/dotnetchina-Furion.git
oschina-mirror
dotnetchina-Furion
dotnetchina-Furion