Nuget: XiaoFeng.Core
QQ群号 | QQ群 | Публичный аккаунт |
---|---|---|
748408911 | ![]() |
![]() |
Исходный код: https://github.com/zhuovi/xiaofeng.core
Руководство: https://www.eelf.cn
Общая библиотека C# для базовых операций, включающая JSON, XML, операции с базами данных ADO.NET (SQLSERVER, MYSQL, ORACLE, DAMENG, SQLITE, ACCESS, OLEDB, ODBC и др.), регулярные выражения, QueryableX (ORM) и EF, сетевые журналы, расписание, операции с файлами, алгоритмы шифрования (AES, DES, DES3, MD5, RSA, RC4, SHA и др.), удобный менеджер конфигураций, пулы приложений, преобразование типов и другие функции.
Создание XiaoFeng.Core с использованием XiaoFeng.Core.
.NET CLI
$ dotnet add package XiaoFeng.Core --version تلفزيون
Package Manager
PM> Install-Package XiaoFeng.Core --Version 2.3.6
PackageReference
<PackageReference Include="XiaoFeng.Core" Version="2.3.6" />
Paket CLI
> paket add XiaoFeng.Core --version 2.3.6
Script & Interactive
> #r "nuget: XiaoFeng.Core, 2.3.6"
Cake
// Установка XiaoFeng.Core как Cake Addin
#addin nuget:?package=XiaoFeng.Core&version=2.3.6
```// Установка XiaoFeng.Core как Cake Tool
#tool nuget:?package=XiaoFeng.Core&version=2.3.6
Добавлен метод IsDefined для проверки наличия определенного атрибута в перечислении;
Исправлен баг в Redis, связанный с неправильным возвратом состояния при публикации;
Улучшена работа с Cookies в HttpHelper.
Добавлен метод отмены задания в настройках задания, добавлен метод отмены задания при запуске;
Улучшена работа событий IJob;
Улучшен метод For;
Добавлен расширенный метод Object.ToStringX();
Улучшен расширенный метод GetValue для преобразования строк в объекты;
Настройка максимального количества сообщений задания в логе;
Улучшена работа планировщика заданий, разделены одноразовые и периодические задания для повышения производительности, уменьшено количество записей в логе для экономии памяти;
Обновлены очереди задач для многопоточного выполнения, улучшена работа событий отмены заданий;### XiaoFeng.Log (Логирование)
Обновлены логи, добавлены решения для проблем с ростом памяти при высокой конкуренции, очистка очереди при превышении 65535 элементов;
Улучшена работа Redis для решения проблемы бесконечного ожидания;
Улучшена работа подключения Redis;
Улучшен ParameterCollection;
Улучшена работа HttpSocket для HTTPS в HttpHelper;
В настройках XiaoFeng добавлен уровень логирования для событий планировщика, по умолчанию Warn;
Добавлен класс ParameterCollection для обработки сортировки и объединения параметров;
Изменен уровень логирования для JobScheduler;
Добавлен метод для преобразования перечислений в строки с учетом регистра;
В классе ParameterCollection добавлен метод GetBytes с различными конструкторами для настройки URL-кодирования и кодировки строк;
Добавлены расширенные методы RSAEncryption для подписи и проверки хэшей;
Исправлены ошибки при сериализации пустых перечислений в JSON и XML;
Улучшена работа при закрытии Redis;## 03.08.2023 v 2.3.01. Удалите переходное пространство имен XiaoFeng.Model.Core;
Оптимизировать создание таблиц данных на основе моделей;
Добавить индексное свойство TableIndexAttribute;
Добавить индексное свойство модели; добавить получение индексного свойства модели;
Добавить проверку наличия таблицы в базе данных;
Исправить ошибку при получении описания перечисления GetDescription при отсутствии текущего перечисления;
Добавить возможность пошагового установления параметров в интерфейсе расписания IJob;
Установить интерфейс задачи IJobWorker;
Добавить методы GetBytes и GetText() для FayFile;
Добавить поддержку паттернов конфигурации в ConfigSet, позволяющую одному конфигурационному моделированию соответствовать нескольким файлам конфигурации;
Обновить время очистки пула потоков до 10 минут;
Исправить отсутствие метода Split(char) в NETSTANDARD 2.0;
Исправить формат date_format в MySQL;
Исправить HttpRequest, заменив ClientCertificates на ClientCertificates;## 2023-05-16 v 2.2.21. Оптимизация DataHelperX;
Оптимизация преобразования байта в SByte;
Оптимизация отображения пустых полей в ResponseMessage;
Исправление ошибок регулярных выражений для проверки номера паспорта и JSON;
Добавление опции ToJson для игнорирования определенных узлов;
Добавление опции ToJson для сериализации узлов в строку при значении длинного целого больше 9007199254740992;
Исправление отображения нуля в фронтенде при сериализации длинного целого больше 9007199254740992 в JSON;---
Пространство имен | Библиотека | Статус открытого исходного кода | Описание | Включенные функции |
---|---|---|---|---|
XiaoFeng. Prototype | XiaoFeng. Core | ![]() |
Расширение библиотеки | ToCase преобразование типов ToTimestamp, ToTimestamps преобразование времени в отметки времени GetBasePath получение абсолютного пути файла, поддерживает Linux, Windows GetFileName получение имени файла GetMatch, GetMatches, GetMatchs, IsMatch, ReplacePattern, RemovePattern операции с регулярными выражениями |
XiaoFeng. Net | XiaoFeng. Net | ![]() |
Библиотека для работы с сетью | XiaoFeng библиотека для работы с сетью, содержит клиент и сервер для сокетов (Socket, WebSocket), позволяет легко реализовать подписку и публикацию и другие функции. |
XiaoFeng. Http | XiaoFeng. Core | ![]() |
Библиотека для имитации HTTP-запросов | Имитация HTTP-запросов |
XiaoFeng. Data | XiaoFeng. Core | ![]() |
Библиотека для работы с базами данных | Поддерживает SQLSERVER, MYSQL, ORACLE, DAMENG, SQLITE, ACCESS, OLEDB, ODBC и другие десятки баз данных |
XiaoFeng. Cache | XiaoFeng. Core | ![]() |
Библиотека кэширования | Кэширование в памяти, Redis, MemcachedCache, MemoryCache, FileCache |
XiaoFeng. Config | XiaoFeng. Core | ![]() |
Библиотека для работы с конфигурационными файлами | Создание модели для автоматического создания конфигурационных файлов, поддерживает форматы XML, JSON, INI |
XiaoFeng. Cryptography | XiaoFeng. Core | ![]() |
Библиотека шифрования | AES, DES, RSA, MD5, DES3, SHA, HMAC, RC4 шифры |
XiaoFeng. Excel | XiaoFeng.Excel | ![]() |
Библиотека для работы с Excel | Работа с Excel, создание, редактирование, чтение содержимого, границы, шрифты, стили и другие функции |
XiaoFeng. Ftp | XiaoFeng. Ftp | ![]() |
Библиотека для работы с FTP | FTP клиент |
XiaoFeng. IO | XiaoFeng. Core | ![]() |
Библиотека для работы с файлами | Чтение и запись файлов |
XiaoFeng. Json | XiaoFeng. Core | ![]() |
Библиотека сериализации и десериализации JSON | Сериализация и десериализация JSON |
XiaoFeng. Xml | XiaoFeng. Core | ![]() |
Библиотека сериализации и десериализации XML | Сериализация и десериализация XML |
XiaoFeng. Log | XiaoFeng. Core | ![]() |
Библиотека для записи логов | Запись логов в файл, базу данных |
XiaoFeng. Memcached | XiaoFeng. Memcached | ![]() |
Библиотека кэширования Memcached | Memcached middleware, поддерживает .NET, .NET Core и .NET Standard, удобный клиентский инструмент. Реализует Set, Add, Replace, Prepend, Append, Cas, Get, Gets, Gat, Gats, Delete, Touch, Stats, Stats Items, Stats Slabs, Stats Sizes, Flush_All, Increment, Decrement и другие функции пула потоков. |
XiaoFeng. Redis | XiaoFeng.Redis | ![]() |
Библиотека кэширования Redis | Redis-клиент, поддерживающий .NET Framework, .NET Core и .NET Standard, удобный инструмент для работы. Поддерживает хэши, ключи, строки, множества, потоки, логи, списки, публикацию/подписку, пулы потоков и другие функции. |
XiaoFeng. Threading | XiaoFeng. Core | ![]() |
Библиотека потоков | Потоковые задачи, потоковые очереди |
XiaoFeng. Mvc | XiaoFeng. Mvc | ![]() |
Низкокодовый WEB-фреймворк | Базовые классы .NET |
XiaoFeng. Proxy | XiaoFeng. Proxy | ![]() |
Библиотека прокси | В разработке |
XiaoFeng. TDengine | XiaoFeng. TDengine | ![]() |
Клиентская библиотека TDengine | В разработке |
XiaoFeng. GB28181 | XiaoFeng. GB28181 | ![]() |
Библиотека для видеонаблюдения, SIP-библиотека, протокол GB28181 | В разработке |
XiaoFeng. Onvif | XiaoFeng. Onvif | ![]() |
Библиотека для видеонаблюдения, протокол Onvif | XiaoFeng. Onvif использует .NET для обертки стандартных интерфейсов, устройств, медиа и управления камерами с использованием C#. Отказ от использования WCF для генерации wsdl-файлов и вместо этого использование XML для обертки параметров, контроль всех данных. |
FayElf. Plugins. WeChat | FayElf. Plugins. WeChat | ![]() |
Библиотека для WeChat-аккаунтов и мини-приложений | Библиотека для WeChat-аккаунтов и мини-приложений. |
Текущий метод позволяет преобразовать любое значение, включая объектные и массивные типы. Перед преобразованием значения проверяется, совпадает ли текущий тип с типом, в который нужно преобразовать. Если типы не совпадают, проверяется, соответствует ли значение формату целевого типа. Если значение не соответствует формату, оно преобразуется в значение по умолчанию для целевого типа. Также можно задать значение по умолчанию.
Примеры преобразования типов данных:
using XiaoFeng;
int a = "10".ToCast<int>();
long b = "10".ToCast<long>();
double c = "10".ToCast<double>();
DateTime d = "2022-01-19".ToCast<DateTime>();
float e = "".ToCast<float>(1.0);
int f = (int)"".GetValue(typeof(int));
Guid g = "58AFBEB5791311ECBF49FA163E542B11".ToCast<Guid>();
Guid h = "58AFBEB5-7913-11EC-BF49-FA163E542B11".ToCast<Guid>();
Также есть ряд методов, специализирующихся на преобразовании строк в различные типы данных, например:
Int16 a = "1".ToInt16();
int b = "2".ToInt32();
Int64 c = "3".ToInt64();
UInt16 d = "4".ToUInt16();
UInt32 e = "5".ToUInt32();
UInt64 f = "6".ToUInt64();
float e = "7.2".ToFloat();
DateTime g = "2022-01-19 12:32".ToDateTime();
double h = "6.3".ToDouble();
byte i = "2".ToByte();
Boolean j = "1".ToBoolean();
Boolean k = "true".ToBoolean();
Boolean l = "False".ToBoolean();
Decimal m = "3.658".ToDecimal();
long n = "2584512".ToLong();
Guid o = "58AFBEB5791311ECBF49FA163E542B11".ToGuid();
Guid p = "58AFBEB5-7913-11EC-BF49-FA163E542B11".ToGuid();
```## Получение базового типа объекта GetValueType
### Примеры использования:
```csharp
var a = "a".GetValueType();
var b = 10.GetValueType();
var c = new { a = "a", b = "b" }.GetValueType();
var d = new Dictionary<string, string>().GetValueType();
Возвращаемое значение представляет собой перечисление типов ValueTypes```csharp
///
Метод IsMatch является расширением, который проверяет, соответствует ли текущая строка заданному регулярному выражению. Например, проверяет, является ли текущая строка номером QQ. Пример кода:
```csharp
if ("7092734".IsMatch(@"^\d{5-11}$"))
Console.WriteLine("Это номер QQ.");
else
Console.WriteLine("Это не номер QQ.");
Результат выполнения: Это номер QQ. Так как строка "7092734" действительно является номером QQ.
Метод IsNotMatch работает аналогично методу IsMatch, но отрицательно проверяет соответствие строки регулярному выражению.
Метод Match возвращает первый найденный соответствующий элемент, используя заданное регулярное выражение и опции поиска.
Метод Matches возвращает все найденные соответствия, используя заданное регулярное выражение и опции поиска.
Эти три метода являются базовыми и другими расширениями используются на их основе.
Метод GetMatch возвращает первый найденный элемент, соответствующий заданному шаблону.
Метод GetPatterns возвращает все найденные элементы, соответствующие заданному шаблону.
Метод GetMatchs возвращает все группы данных, соответствующие первому найденному элементу.
Метод GetMatches возвращает все группы данных, соответствующие всем найденным элементам.
Количество извлекаемых данных: GetMatch < GetMatchs < GetPatterns < GetMatches
Метод ReplacePattern используется для замены данных с использованием регулярного выражения.Примеры использования этих методов:
var a = "abc4d5e6hh5654".GetMatch(@"\d+");
a равно: "4";
var b = "abc4d5e6hh5654".GetPatterns(@"\d+");
b равно: ["4", "5", "6", "5654"];
var c = "abc4d5e6hh5654".GetMatchs(@"(?<a>[a-z]+)(?<b>\d+)");
c равно: {{"a", "abc"}, {"b", "4"}};
var d = "abc4d5e6hh5654".GetMatches(@"(?<a>[a-z]+)(?<b>\d+)");
d равно: [{{"a", "abc"}, {"b", "4"}}, {{"a", "d"}, {"b", "5"}}, {{"a", "e"}, {"b", "6"}}, {{"a", "hh"}, {"b", "5654"}}]
var g = "a6b9c53".ReplacePattern(@"\d+", "g");
g равно: "agbgcg";
var h = "a6b7c56".RemovePattern(@"\d+");
h равно: "abc";
var i = "a1b2c3".ReplacePattern(@"\d+", m => {
var a = m.Groups["a"].Value;
if(a == "1") return "a1";
else return "a2";
});
i равно: "aa1ba2ca2";
```## Преобразование чисел в прописные цифры ToChineseNumber и ToNumber
### Примеры использования
```csharp
var a = "123456789.1234";
// Преобразование в прописные цифры
var b = a.ToChineseNumber();
// Результат: Сто двадцать три миллиона четыреста пятьдесят шесть тысяч семьсот восемьдесят девять целых одна тысяча двести тридцать четыре десятых
// Преобразование в прописные цифры для денежных единиц
var c = a.ToChineseNumber(UpperType.Money);
// Результат: Сто двадцать три миллиона четыреста пятьдесят шесть тысяч семьсот восемьдесят девять рублей одна тысяча двести тридцать четыре копейки
// Преобразование прописных цифр в числа
var d = c.ToNumber();
// Результат: 123456789.1234
// Преобразование прописных цифр в числа с добавлением формата
var e = c.ToNumber(true);
// Результат: 123 456 789.1234
// Преобразование чисел в числа с добавлением формата
var f = "123456789.1235684".ToNumber(true);
// Результат: 123 456 789.1235684
```# Управление конфигурациями XiaoFeng.Config.ConfigSet<>
Простое наследование текущего класса позволяет легко управлять конфигурационными файлами, кэшировать, добавлять, удалять, изменять и извлекать данные.
## Примеры использования
Класс XiaoFeng автоматически создает конфигурационный файл XiaoFeng.json. Исходный код библиотеки классов представлен ниже.```csharp
/// <summary>
/// Общая конфигурация XiaoFeng
/// </summary>
[ConfigFile("Config/XiaoFeng.json", 0, "FAYELF-CONFIG-XIAOFENG", ConfigFormat.Json)]
public class Setting : ConfigSet<Setting>, ISetting
{
#region Конструкторы
/// <summary>
/// Базовый конструктор
/// </summary>
public Setting() : base() { }
/// <summary>
/// Конструктор с указанием имени файла конфигурации
/// </summary>
/// <param name="fileName"></param>
public Setting(string fileName) : base(fileName) { }
#endregion
#region Свойства
/// <summary>
/// Включить отладку
/// </summary>
[Description("Включить отладку")]
public bool Debug { get; set; } = true;
/// <summary>
/// Максимальное количество потоков
/// </summary>
[Description("Максимальное количество потоков")]
public int MaxWorkerThreads { get; set; } = 100;
/// <summary>
/// Время простоя при потреблении логов
/// </summary>
[Description("Время простоя при потреблении логов")]
public int IdleSeconds { get; set; } = 60;
/// <summary>
/// Время ожидания выполнения задачи в очереди
/// </summary>
private int _TaskWaitTimeout = 5 * 60;
/// <summary>
/// Время ожидания выполнения задачи в очереди
/// </summary>
[Description("Время ожидания выполнения задачи в очереди")]
public int TaskWaitTimeout {
get
{
if (this._TaskWaitTimeout == 0)
this._TaskWaitTimeout = 10 * 1000;
return this._TaskWaitTimeout;
}
set
{
this._TaskWaitTimeout = value;
}
}
/// <summary>
/// Включить шифрование данных
/// </summary>
``` [Description("Enable data encryption")]
public bool DataEncrypt { get; set; } = false;
/// <summary>
/// Data encryption key
/// </summary>
[Description("Data encryption key")]
public string DataKey { get; set; } = "7092734";
/// <summary>
/// Enable request logging
/// </summary>
[Description("Enable request logging")]
public bool ServerLogging { get; set; }
/// <summary>
/// Enable interception
/// </summary>
[Description("Enable interception")]
public bool IsIntercept { get; set; }
/// <summary>
/// SQL injection string
/// </summary>
[Description("SQL injection string")]
public string SQLInjection { get; set; } = @"insert\s+into |update |delete |select | union | join |exec |execute | exists|'|truncate |create |drop |alter |column |table |dbo\. |sys\. |alert\(|<scr|ipt>|<script|confirm\(|console\. |\. js|<\/\s*script>|now\(\)|getdate\(\)|time\(\)| Directory\. | File\. |FileStream |\. Write\(|\. Connect\(|<\? php|show tables |echo | outfile |Request[\. \(]|Response[\. ```markdown
```json
{
"Debug"/*enable debugging*/: true,
"MaxWorkerThreads"/*maximum number of worker threads*/: 100,
"IdleSeconds"/*idle time before logging*/: 60,
"TaskWaitTimeout"/*task wait timeout*/: 300,
"DataEncrypt"/*enable data encryption*/: false,
"DataKey"/*data encryption key*/: "7092734",
"ServerLogging"/*enable request logging*/: false,
"IsIntercept"/*enable interception*/: false,
"SQLInjection"/*SQL injection string*/: "insert\\s+into |update |delete |select | union | join |exec |execute | exists|'|truncate |create |drop |alter |column |table |dbo\\. |sys\\. |alert\\(|<scr|ipt>|<script|confirm\\(|console\\. |\\. js|<\\/\\s*script>|now\\(\\)|getdate\\(\\)|time\\(\\)| Directory\\. | File\\. |FileStream |\\. Write\\(|\\. Connect\\(|<\\? php|show tables |echo | outfile |Request[\. \(]|Response[\. ``````markdown
php|show tables |echo | outfile |Request[\\. \\(]|Response[\\. \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\. CreateObject|VBScript\\. Encode|replace\\(|location|\\-\\-"
}
ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。
DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла
php|show tables |echo | outfile |Request[\\. \\(]|Response[\\. \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\. CreateObject|VBScript\\. Encode|replace\\(|location|\\-\\-"
}
ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。
DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла
php|show tables |echo | outfile |Request[\\. \\(]|Response[\\. \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\. CreateObject|VBScript\\. Encode|replace\\(|location|\\-\\-"
}
ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。
DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла
php|show tables |echo | outfile |Request[\\. \\(]|Response[\\. \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\. CreateObject|VBScript\\. Encode|replace\\(|location|\\-\\-"
}
ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。
DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла
php|show tables |echo | outfile |Request[\\. \\(]|Response[\\. \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\. CreateObject|VBScript\\. Encode|replace\\(|location|\\-\\-"
}
ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。
DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла
php|show tables |echo | outfile |Request[\\. \\(]|Response[\\. \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\. CreateObject|VBScript\\. Encode|replace\\(|location|\\-\\-"
}
ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。
DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла
php|show tables |echo | outfile |Request[\\. \\(]|Response[\\. \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\. CreateObject|VBScript\\. Encode|replace\\(|location|\\-\\-"
}
ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。
DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла
php|show tables |echo | outfile |Request[\\. \\(]|Response[\\. \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\. CreateObject|VBScript\\. Encode|replace\\(|location|\\-\\-"
}
ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。
DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла
php|show tables |echo | outfile |Request[\\. \\(]|Response[\\. \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\. CreateObject|VBScript\\. Encode|replace\\(|location|\\-\\-"
}
ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。
DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла
php|show tables |echo | outfile |Request[\\. \\(]|Response[\\. \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\. CreateObject|VBScript\\. Encode|replace\\(|location|\\-\\-"
}
ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。
DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла
php|show tables |echo | outfile |Request[\\. \\(]|Response[\\. \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\. CreateObject|VBScript\\. Encode|replace\\(|location|\\-\\-"
}
ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。
DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла
php|show tables |echo | outfile |Request[\\. \\(]|Response[\\. \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\. CreateObject|VBScript\\. Encode|replace\\(|location|\\-\\-"
}
ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。
DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла
php|show tables |echo | outfile |Request[\\. \\(]|Response[\\. \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\. CreateObject|VBScript\\. Encode|replace\\(|location|\\-\\-"
}
ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。
DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла
php|show tables |echo | outfile |Request[\\. \\(]|Response[\\. \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\. CreateObject|VBScript\\. Encode|replace\\(|location|\\-\\-"
}
ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。
DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла
php|show tables |echo | outfile |Request[\\. \\(]|Response[\\. \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\. CreateObject|VBScript\\. Encode|replace\\(|location|\\-\\-"
}
ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。
DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла
php|show tables |echo | outfile |Request[\\. \\(]|Response[\\. \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\. CreateObject|VBScript\\. Encode|replace\\(|location|\\-\\-"
}
ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。
DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла
php|show tables |echo | outfile |Request[\\. \\(]|Response[\\. \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\. CreateObject|VBScript\\. Encode|replace\\(|location|\\-\\-"
}
ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。
DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла
php|show tables |echo | outfile |Request[\\. \\(]|Response[\\. \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\. CreateObject|VBScript\\. Encode|replace\\(|location|\\-\\-"
}
ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。
```csharp
var set = XiaoFeng.Config.Setting.Current;
// Чтение данных узла
var debug = set.Debug;
// Установка данных узла
set.Debug = false;
// Сохранение текущей конфигурации методом Save обновляет содержимое в конфигурационном файле
set.Save();
HttpHelper — это библиотека для имитации HTTP-запросов. Предоставляет три ядра: HttpClient, HttpWebRequest, HttpSocket По умолчанию используется ядро HttpClient
var result = await XiaoFeng.Http.HttpHelper.GetHtmlAsync(new XiaoFeng.Http.HttpRequest
{
Method = HttpMethod.Get, // Не задано, по умолчанию GET
HttpCore = HttpCore.HttpClient, // Не задано, по умолчанию HttpClient
Address = "http://www.fayelf.com"
});
if (result.StatusCode == System.Net.HttpStatusCode.OK)
{
/* Запрос успешен */
// Содержимое ответа
var value = result.Html;
// Байтовое содержимое ответа
var bytes = result.Data;
}
else
{
/* Запрос не успешен */
}
var result = await XiaoFeng.Http.HttpHelper.GetHtmlAsync(new XiaoFeng.Http.HttpRequest
{
Method = HttpMethod.Post,
Address = "http://www.fayelf.com",
Data = new Dictionary<string, string>
{
{"account", "jacky" },
{"password", "123456" }
}
});
if (result.StatusCode == System.Net.HttpStatusCode.OK)
{
/* Запрос успешен */
// Содержимое ответа
var value = result.Html;
// Байтовое содержимое ответа
var bytes = result.Data;
}
else
{
/* Запрос не успешен */
}
csharp var result = await XiaoFeng.Http.HttpHelper.GetHtmlAsync(new XiaoFeng.Http.HttpRequest { Method = HttpMethod.Post, ContentType = "application/json", Address = "http://www.fayelf.com", BodyData = @"{""account"":""jacky"",""password"":""123456""}" }); if (result.StatusCode == System.Net.HttpStatusCode.OK) { /* Запрос успешен */ // Содержимое ответа var value = result.Html; // Байтовое содержимое ответа var bytes = result.Data; } else { /* Запрос не успешен */ }
* POST запрос с FORMDATA, то есть запрос, содержащий как данные формы, так и потоки файлов```csharp
var result = await XiaoFeng.Http.HttpHelper.GetHtmlAsync(new XiaoFeng.Http.HttpRequest
{
Method = HttpMethod.Post,
ContentType = "application/x-www-form-urlencoded",
Address = "http://www.fayelf.com",
FormData = new List<XiaoFeng.Http.FormData>
{
new XiaoFeng.Http.FormData
{
Name="account", Value="jacky", FormType= XiaoFeng.Http.FormType.Text
},
new XiaoFeng.Http.FormData
{
Name="password", Value="123456", FormType= XiaoFeng.Http.FormType.Text
},
new XiaoFeng.Http.FormData
{
Name="headimage", Value=@"E://Work/headimage.png", FormType= XiaoFeng.Http.FormType.File
}
}
});
if (result.StatusCode == System.Net.HttpStatusCode.OK)
{
/Запрос выполнен успешно/
//Ответное содержимое
var value = result.Html;
//Байтовое содержимое ответа
var bytes = result.Data;
}
else
{
/Запрос не выполнен успешно/
}
* Скачать файл
``` csharp
await XiaoFeng.Http.HttpHelper.Instance.DownFileAsync(new XiaoFeng.Http.HttpRequest
{
Method = HttpMethod.Get,
Address = "http://www.fayelf.com/test.rar"
}, @"E:/Work/test.rar");
```
# Операции с базой данных DataHelper
* XiaoFeng.Data.DataHelper, текущий класс поддерживает SQLSERVER, MYSQL, ORACLE, DAMENG, SQLITE, ACCESS, OLEDB, ODBC и десятки других типов баз данных.
## Пояснения по использованию
Простой пример
```csharp
var data = new XiaoFeng.Data.DataHelper(new XiaoFeng.Data.ConnectionConfig
{
ProviderType= XiaoFeng.Data.DbProviderType.SqlServer,
ConnectionString= "server=.;uid=testuser;pwd=123;database=Fay_TestDb;"
});
var dt = data.ExecuteDataTable("select * from F_Tb_Account;");
```
1. Прямое выполнение SQL-запроса```csharp
var non1 = data.ExecuteNonQuery("insert into F_Tb_Account(Account,Password) values('jacky','admin');");
```
Значение non1, если non1 равно -1, означает, что выполнение запроса завершилось ошибкой, и можно получить последнюю ошибку через data.ErrorMessage.
Если non1 больше или равно 0, это означает количество выполненных строк SQL-запроса.2. Возврат DataTable
```csharp
var dt = data.ExecuteDataTable("select * from F_Tb_Account;");
```
dt это объект DataTable.
3. Возврат первого столбца первой строки
```csharp
var val1 = data.ExecuteScalar("select Account from F_Tb_Account;");
```
Тип val1 объект, в зависимости от значений базы данных можно использовать пользовательские преобразования, например: var val2 = (int)val1; также можно использовать расширения XiaoFeng, например: var val2 = val1.ToCast<int>();
4. Возврат объекта DataReader
```csharp
var dataReader = data.ExecuteReader("select * from F_Tb_Account;");
```
dataReader это объект DataReader.
5. Возврат объекта DataSet
```csharp
var dataSet = data.ExecuteDataSet("select * from F_Tb_Account;select * from F_Tb_Account;");
```
dataSet это объект DataSet.
6. Выполнение хранимых процедур
```csharp
var data = data.ExecuteDataTable("proc_name", System.Data.CommandType.StoredProcedure, new System.Data.Common.DbParameter[]
{
data.MakeParam(@"Account","jacky")
});
```
7. SQL-запрос с параметрами
```csharp
var data2 = data.ExecuteDataTable("select * from F_Tb_Account where Account=@Account;", new System.Data.Common.DbParameter[]
{
data.MakeParam(@"@Account","jacky")
});
```
8. Прямое преобразование в объект
```csharp
var models = data.QueryList<Account>("select * from F_Tb_Account");
var model = data.Query<Account>("select * from F_Tb_Account");
```
# XiaoFeng.Threading.JobScheduler Задачи планирования
Планирование задач представляет собой таймер, который выполняет задания в определенное время, например: каждую минуту, каждый час, каждый день, каждую неделю, каждый месяц в определенное время и т.д.
Класс задачи: XiaoFeng.Threading.Job
Основной класс планирования: XiaoFeng.Threading.JobScheduler## Пояснение по использованию
1. Выполнение задачи один раз через определенное время
```csharp
var job = new XiaoFeng.Threading.Job
{
Async = true,
Name = "Название задачи",
TimerType = XiaoFeng.Threading.TimerType.Once,
StartTime = DateTime.Now.AddMinutes(5),
SuccessCallBack = job =>
{
/*Выполнение задачи по истечению времени*/
}
};
job.Start();
```
Текущая задача будет выполнена через 5 минут, затем уничтожена и удалена из планировщика.
2. Периодическое выполнение задачи
```csharp
var job = new XiaoFeng.Threading.Job
{
Async = true,
Name = "Название задачи",
TimerType = XiaoFeng.Threading.TimerType.Interval,
Period = 5000,
StartTime = DateTime.Now.AddMinutes(5),
SuccessCallBack = job =>
{
/*Выполнение задачи по истечению времени*/
}
};
job.Start();
```
Текущая задача будет запущена через 5 минут, затем выполнена каждые 5000 миллисекунд (5 минут).
3. Ежедневное выполнение задачи
```csharp
var job = new XiaoFeng.Threading.Job
{
Async = true,
Name = "Название задачи",
TimerType = XiaoFeng.Threading.TimerType.Day,
Times = new List<Times> { new Times(2, 0, 0), new Times(4, 0, 0) },
StartTime = DateTime.Now.AddMinutes(5),
SuccessCallBack = job =>
{
/*Выполнение задачи по истечению времени*/
}
};
```
Текущая задача будет запущена через 5 минут, затем выполнена каждый день в 2:00 и 4:00.
4. Выполнение задачи в определенные дни недели и месяца
```csharp
var job = new XiaoFeng.Threading.Job
{
Async = true,
Name = "Название задачи",
TimerType = XiaoFeng.Threading.TimerType.Week,
Times = new List<Times> { new Times(10, 12, 13, week: 1), new Times(11, 12, 13, week: 1) },
StartTime = DateTime.Now.AddMinutes(5),
SuccessCallBack = job =>
{
/*Выполнение задачи по истечению времени*/
}
};
job.Start();
```Текущая задача будет запущена через 5 минут, затем выполнена каждый понедельник в 10:12:13 и 11:12:13.
# XiaoFeng.Xml XML сериализация
Сериализация XML — это преобразование объекта данных в XML-формат, а десериализация — преобразование XML-данных обратно в объект данных.
Пространство имен: XiaoFeng.Xml
Сначала рассмотрим конфигурацию сериализации```csharp
/// <summary>
/// Настройки сериализации
/// </summary>
public class XmlSerializerSetting
{
#region Конструкторы
/// <summary>
/// Безаргументный конструктор
/// </summary>
public XmlSerializerSetting()
{ }
#endregion
```
#region Свойства
/// <summary>
/// Формат Guid
/// </summary>
public string GuidFormat { get; set; } = "D";
/// <summary>
/// Формат даты
/// </summary>
public string DateTimeFormat { get; set; } = "yyyy-MM-dd HH:mm:ss.fff";
/// <summary>
/// Включено форматирование
/// </summary>
public bool Indented { get; set; } = true;
/// <summary>
/// Значение типа перечисления
/// </summary>
public EnumValueType EnumValueType { get; set; } = 0;
/// <summary>
/// Максимальная глубина
/// </summary>
public int MaxDepth { get; set; } = 28;
/// <summary>
/// Пропускание комментариев
/// </summary>
public bool OmitComment { get; set; } = true;
/// <summary>
/// Игнорирование регистра ключей
/// </summary>
public bool IgnoreCase { get; set; } = false;
/// <summary>
/// Значение по умолчанию для корневого узла
/// </summary>
public string DefaultRootName { get; set; } = "Root";
/// <summary>
/// Значение по умолчанию для кодировки
/// </summary>
public Encoding DefaultEncoding { get; set; } = Encoding.UTF8;
/// <summary>
/// Получает или задает значение, указывающее, следует ли System.Xml.XmlWriter удалять повторяющиеся объявления пространств имен при записи XML-содержимого. Значение по умолчанию — вывод всех объявленных пространств имен в пространстве имен разрешения писателя.
/// </summary>
public NamespaceHandling NamespaceHandling { get; set; }
/// <summary>
/// Пропускание объявления XML
/// </summary>
public bool OmitXmlDeclaration { get; set; } = false;
/// <summary>
/// Получает или задает строку, используемую для символа новой строки. Строка, используемая для символа новой строки. Она может быть установлена как любой строковый значением.
/// </summary>
Однако, чтобы гарантировать, что XML является валидным, следует использовать только допустимые пробелы, такие как пробел, табуляция, возврат каретки или новая строка. Значение по умолчанию — \r\n (возврат каретки, новая строка).
/// </summary>
public string NewLineChars { get; set; } = Environment.NewLine;
/// <summary>
/// Пропуск имени узла для элементов массива, где ключ не указан
/// </summary>
public Boolean OmitArrayItemName { get; set; } = true;
/// <summary>
/// Пропуск пустых узлов
/// </summary>
public Boolean OmitEmptyNode { get; set; } = true;
/// <summary>
/// Пропуск пространств имен
/// </summary>
public Boolean OmitNamespace { get; set; } = true;
#endregion
}Простое использование, расширены два метода EntityToXml(), XmlToEntity();Сначала рассмотрим XML-модель объекта
```csharp
/// <summary>
/// Описание класса XmlModel
/// </summary>
[XmlRoot("Root")]
public class XmlModel
{
#region Конструкторы
/// <summary>
/// Базовый конструктор
/// </summary>
public XmlModel()
{
}
#endregion
#region Свойства
/// <summary>
/// Свойство 1
/// </summary>
[XmlCData]
[XmlElement("NameA")]
public string FieldName1 { get; set; }
/// <summary>
/// Свойство 2
/// </summary>
[XmlConverter(typeof(XiaoFeng.Xml.StringEnumConverter))]
[XmlElement("NameB")]
public EnumValueType FieldName2 { get; set; }
/// <summary>
/// Свойство 3
/// </summary>
[XmlConverter(typeof(XiaoFeng.Xml.DescriptionConverter))]
[XmlElement("Namec")]
public EnumValueType FieldName3 { get; set; }
/// <summary>
/// Свойство 4
/// </summary>
public string FieldName4 { get; set; }
#endregion
#region Методы
#endregion
}
```
Простое использование
```csharp
var a = new XmlModel
{
FieldName1 = "Value1",
FieldName2 = EnumValueType.Name,
FieldName3 = EnumValueType.Value,
FieldName4 = "Value4"
}.EntityToXml();
//XmlSerializer.Serializer(a) и a.EntityToXml() одинаковы
```
//Результат
```xml
<?xml version="1.0" encoding="utf-8"?>
<Root>
<NameA><![CDATA[Value1]]></NameA>
<NameB>Name</NameB>
<Namec>значение</Namec>
<FieldName4>Value4</FieldName4>
</Root>
var b = a.XmlToEntity<XmlModel>();
//XmlSerializer.Deserialize<XmlModel>(a) и XmlToEntity<XmlModel>() одинаковы
```
Далее рассмотрим несколько особенностей сериализации```csharp
// Ignoring properties
XmlIgnoreAttribute
// Specifying node name
XmlElementPath
// Type conversion
XmlConverterAttribute
// Enum conversion
StringEnumConverter
// Description conversion
DescriptionConverter
```
Далее приведем пример использования `XmlElementPath`. Текущее свойство поддерживает только десериализацию, сериализация пока не поддерживается. Предположим, что у нас есть такой XML:
```xml
<root>
<node name="example" />
</root>
``````xml
<?xml version="1.0" encoding="utf-8"?>
<Root>
<NameA>
<NameD><![CDATA[Value1]]></NameD>
<NameC>bbb</NameC>
</NameA>
<NameB>Name</NameB>
<Namec>значение</Namec>
<FieldName4>Value4</FieldName4>
</Root>
```
По общим правилам определения модели, подузел A и B должны быть определены в отдельном классе.
На самом деле, можно определить следующим образом:
```csharp
/// <summary>
/// Описание класса XmlModel
/// </summary>
[XmlRoot("Root")]
public class XmlModel
{
#region Конструкторы
/// <summary>
/// Конструктор без параметров
/// </summary>
public XmlModel()
{
}
#endregion
#region Свойства
/// <summary>
/// Свойство 1
/// </summary>
[XmlCData]
[XmlElementPath("NameA/NameC")]
public string A { get; set; }
/// <summary>
/// Свойство 2
/// </summary>
[XmlCData]
[XmlElementPath("NameA/NameD")]
public string B { get; set; }
/// <summary>
/// Свойство 3
/// </summary>
[XmlConverter(typeof(XiaoFeng.Xml.StringEnumConverter))]
[XmlElement("NameB")]
public EnumValueType FieldName2 { get; set; }
/// <summary>
/// Свойство 4
/// </summary>
[XmlConverter(typeof(XiaoFeng.Xml.DescriptionConverter))]
[XmlElement("Namec")]
public EnumValueType FieldName3 { get; set; }
/// <summary>
/// Свойство 5
/// </summary>
public string FieldName4 { get; set; }
#endregion
#region Методы
#endregion
}
```
Результат десериализации:
```csharp
// Результат десериализации
```Если данные можно извлечь напрямую из дочерних узлов и десериализовать в объект, без необходимости определения отдельного подмодели.
Если не требуется определение модели, в XiaoFeng.Xml предоставляется универсальный объект модели XmlValue.
XML-сериализация и десериализация были рассмотрены, для практического применения необходимо самостоятельно выполнить соответствующие действия.# XiaoFeng.Json JSON сериализация
JSON сериализация — это процесс преобразования объекта данных в JSON данные, а также преобразование JSON данных обратно в объект данных.
Пространство имен: XiaoFeng.Json
Метод сериализации: JsonParser.SerializeObject, также можно использовать расширение метода ToJson()
Метод десериализации: JsonParser.JsonParser.DeserializeObject<T>(), также можно использовать расширение метода JsonToObject()
Пример использования, смотрите код
```csharp
// Сериализация
var a = new {
key1 = "value1",
key2 = "value2"
}.ToJson();
// Значение a: {"key1":"value1","key2":"value2"}
// Десериализация
var b = @"{""key1"":""value1"",""key2"":""value2""}.JsonToObject();
// Значение b: словарь в формате JSON
```
В приведенном выше примере используется анонимный объект, при десериализации, поскольку тип не указан, он автоматически преобразуется в объект типа JsonValue;
Далее подробное описание конфигурации сериализации, при использовании расширений Tojson, JsonToObject можно указать параметры конфигурации. Параметры конфигурации следующие:
``````csharp
/// <summary>
/// Настройки сериализации JSON
/// </summary>
public class JsonSerializerSetting
{
#region Конструкторы
/// <summary>
/// Базовый конструктор
/// </summary>
public JsonSerializerSetting() { }
#endregion #region Свойства
/// <summary>
/// Формат GUID
/// </summary>
public string GuidFormat { get; set; } = "D";
/// <summary>
/// Формат даты и времени
/// </summary>
public string DateTimeFormat { get; set; } = "yyyy-MM-dd HH:mm:ss.fff";
/// <summary>
/// Флаг форматирования
/// </summary>
public bool Indented { get; set; } = false;
/// <summary>
/// Тип значения перечисления
/// </summary>
public EnumValueType EnumValueType { get; set; } = 0;
/// <summary>
/// Максимальная глубина разбора
/// </summary>
public int MaxDepth { get; set; } = 28;
/// <summary>
/// Флаг записи комментариев
/// </summary>
public bool IsComment { get; set; } = false;
/// <summary>
/// Флаг игнорирования регистра ключей
/// </summary>
public bool IgnoreCase { get; set; } = false;
/// <summary>
/// Флаг игнорирования пустых узлов
/// </summary>
public bool OmitEmptyNode { get; set; } = false;
#endregion
}
```
Далее рассмотрим несколько характеристик при сериализации.```csharp
// Игнорирование значений свойств
JsonIgnoreAttribute
// Указание имени узла
JsonElement
// Конвертация типов
JsonConverterAttribute
// Конвертер перечислений
StringEnumConverter
// Конвертер описаний
DescriptionConverter
```
Далее рассмотрим примеры; ниже приведен определенный JSON-модель
```csharp
/// <summary>
/// Описание класса JsonModel
/// </summary>
public class JsonModel
{
#region Конструкторы
/// <summary>
/// Базовый конструктор
/// </summary>
public JsonModel()
{
}
#endregion
#region Свойства
/// <summary>
/// Свойство 1
/// </summary>
[JsonElement("NameA")]
public string FieldName1 { get; set; }
/// <summary>
/// Свойство 2
/// </summary>
[JsonConverter(typeof(XiaoFeng.Json.DescriptionConverter))]
[JsonElement("NameB")]
public EnumValueType FieldName2 { get; set; }
/// <summary>
/// Свойство 3
/// </summary>
[JsonConverter(typeof(XiaoFeng.Json.StringEnumConverter))]
[JsonElement("NameC")]
public EnumValueType FieldName3 { get; set; }
/// <summary>
/// Свойство 4
/// </summary>
[JsonElement("NameD")]
public EnumValueType FieldName4 { get; set; }
#endregion
``` #region Методы
``` #endregion
}
//При использовании
var a = new JsonModel
{
FieldName1 = "aaaa",
FieldName2 = EnumValueType.Name,
FieldName3 = EnumValueType.Value,
FieldName4 = EnumValueType.Value
}.ToJson();
//Текущий JSON-формат: {"NameA":"aaaa","NameB":"имя","NameC":"Значение","NameD":0}
//Потому что FieldName1 был установлен как NameA, FieldName2 был установлен как NameB, FieldName3 был установлен как NameC, а FieldName4 не был установлен
//Два значения перечисления различаются, потому что второе значение было установлено для чтения содержимого Description, то есть значение атрибута DescriptionAttribute для EnumValueType.Name
//Третье значение берется из Value, потому что используется конвертер StringEnumConverter, поэтому значение сразу преобразуется в имя. Если конвертер не установлен, то будет выведен соответствующий номер
//При десериализации также соответствует этому формату в модели объектаJson-сериализация и десериализация были описаны. Для более подробного понимания необходимо самостоятельно выполнить практические операции.
# Об авторе
* Сайт: http://www.fayelf.com
* QQ: 7092734
* E-Mail: jacky@fayelf.com
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )