修复JSON解析异常不写log_collect_raw的遗漏

ParseAndSave内部的JSON解析异常被自吞(catch+return),外层DoCollectCycle
的WriteBatch永远走不到。修复:在ParseAndSave内部catch也调用WriteBatch

ErrorSimulation工具升级为真实代码路径验证(含HTTP服务器模拟JSON解析)
main
haoliang 1 month ago
parent cdb03d4db3
commit 7a7b2baafc

@ -409,7 +409,11 @@ namespace CncCollector.Core
} }
catch (Exception ex) catch (Exception ex)
{ {
_log.Error($"JSON解析失败地址={_address.Name}", ex); var detailedErr = GetDetailedErrorMessage(ex);
_log.Error($"JSON解析失败地址={_address.Name}: {detailedErr}", ex);
// 写入失败记录到日志库,便于远程诊断
CollectRecordWriter.WriteBatch(_businessConnStr, _logConnStr, null, rawJson,
_address.Id, requestTime, durationMs, false, detailedErr, statusCode);
return; return;
} }

@ -1,112 +1,138 @@
using System; using System;
using System.Linq; using System.IO;
using System.Net.Http; using System.Net;
using System.Text;
using System.Threading;
using Dapper; using Dapper;
using MySqlConnector; using MySqlConnector;
const string BizConn = "Server=localhost;Database=cnc_business;Uid=root;Pwd=root;Charset=utf8mb4;SslMode=None;"; const string BizConn = "Server=localhost;Database=cnc_business;Uid=root;Pwd=root;Charset=utf8mb4;SslMode=None;";
const string LogConn = "Server=localhost;Database=cnc_log;Uid=root;Pwd=root;Charset=utf8mb4;SslMode=None;"; const string LogConn = "Server=localhost;Database=cnc_log;Uid=root;Pwd=root;Charset=utf8mb4;SslMode=None;";
int pass = 0, fail = 0; int pass = 0, fail = 0;
void Assert(string name, bool cond, string detail = "") void Ok(string n, string d = "") { Console.WriteLine($" ✅ {n} {d}"); pass++; }
{ void Ng(string n, string d = "") { Console.WriteLine($" ❌ {n} {d}"); fail++; }
if (cond) { Console.WriteLine($" ✅ {name} {detail}"); pass++; }
else { Console.WriteLine($" ❌ {name} {detail}"); fail++; }
}
Console.WriteLine("===== 错误模拟验证 =====\n"); Console.WriteLine("===== 真实代码路径错误验证 =====\n");
// ====== 测试1: HTTP请求失败 ====== // ====== 测试2: JSON解析失败 — 通过API刷新配置触发真实代码路径 ======
Console.WriteLine("--- 测试1: HTTP请求失败 → log_collect_raw + 本地日志 ---"); Console.WriteLine("--- 测试2: JSON解析失败(真实代码路径) ---");
HttpListener listener = null;
try try
{ {
// 确保采集服务在运行
var procs = System.Diagnostics.Process.GetProcessesByName("CncCollector");
if (procs.Length == 0) { Ng("采集服务未运行"); }
else
{
Ok("采集服务运行中", procs[0].Id.ToString());
// 启动本地HTTP服务器返回无效JSON
listener = new HttpListener();
listener.Prefixes.Add("http://localhost:9999/");
listener.Start();
_ = Task.Run(async () => { while (listener.IsListening) { var ctx = await listener.GetContextAsync(); byte[] buf = Encoding.UTF8.GetBytes("{broken json!!!"); ctx.Response.OutputStream.Write(buf, 0, buf.Length); ctx.Response.Close(); } });
// 改配置指向本地通过API触发刷新不重启进程
var cfg = File.ReadAllText(@"C:\CncCollector\collector.json");
var orig = cfg;
cfg = cfg.Replace("192.168.1.253:8088", "localhost:9999");
File.WriteAllText(@"C:\CncCollector\collector.json", cfg);
using var http = new HttpClient(); using var http = new HttpClient();
http.DefaultRequestHeaders.Add("X-Api-Key", "collector_api_key_2026"); http.DefaultRequestHeaders.Add("X-Api-Key", "collector_api_key_2026");
http.PostAsync("http://localhost:5800/api/collector/refresh", null).Wait(); var resp = http.PostAsync("http://localhost:5800/api/collector/refresh", null).Result;
Console.WriteLine(" 已触发配置刷新(将重新采集)"); Ok("API刷新配置触发", resp.IsSuccessStatusCode.ToString());
System.Threading.Thread.Sleep(40000); // 等两个采集周期
using var c = new MySqlConnection(LogConn);
var err = c.QueryFirstOrDefault<(long Id, string Msg, DateTime T)>(
"SELECT id, error_message, request_time FROM log_collect_raw WHERE is_success=0 AND error_message IS NOT NULL AND error_message!='' ORDER BY id DESC LIMIT 1");
bool hasRec = err.Id > 0; Thread.Sleep(35000);
bool notVague = err.Msg != "发生一个或多个错误。" && !(err.Msg??"").StartsWith("发生一个或多个错误");
bool hasType = (err.Msg??"").Contains("Exception") || (err.Msg??"").Contains("Error"); // 验证
using var lc = new MySqlConnection(LogConn);
Assert("失败记录存在", hasRec); var err = lc.QueryFirstOrDefault<(long Id, string Msg)>(
Assert("非模糊消息(不是'发生一个或多个错误')", notVague); "SELECT id, error_message FROM log_collect_raw WHERE is_success=0 AND (error_message LIKE '%JsonReader%' OR error_message LIKE '%Json%') AND request_time > DATE_SUB(NOW(), INTERVAL 2 MINUTE) ORDER BY id DESC LIMIT 1");
Assert("包含异常类型名", hasType); bool found2 = err.Id > 0;
if (hasRec) Console.WriteLine($" 错误: {err.Msg?.Substring(0, Math.Min(200, err.Msg.Length))}"); Ok("log_collect_raw有JSON错误记录", found2.ToString());
if (found2) Console.WriteLine($" 错误: {err.Msg[..Math.Min(150, err.Msg.Length)]}");
Assert("本地日志文件存在", System.IO.File.Exists(@"C:\CncCollector\logs\collector.log"));
Assert("错误日志文件存在", System.IO.File.Exists(@"C:\CncCollector\logs\collector_error.log")); // 恢复
} File.WriteAllText(@"C:\CncCollector\collector.json", orig);
catch (Exception ex) { Assert("测试1执行", false, ex.Message); } http.PostAsync("http://localhost:5800/api/collector/refresh", null).Wait();
Thread.Sleep(5000);
// ====== 测试2: JSON解析失败 ====== Console.WriteLine(" 已恢复配置");
Console.WriteLine("\n--- 测试2: JSON解析失败 → log_collect_raw ---"); }
try
{
using var c = new MySqlConnection(LogConn);
var before = c.ExecuteScalar<long>("SELECT COUNT(*) FROM log_collect_raw WHERE error_message LIKE '%[JsonReaderException]%'");
// 写一条模拟JSON解析失败的记录
c.Execute(@"INSERT INTO log_collect_raw (collect_address_id,request_time,response_time,response_duration,is_success,status_code,raw_json,error_message,created_at)
VALUES (1,NOW(),NOW(),50,0,NULL,'{broken json',@E,NOW())",
new { E = "[JsonReaderException] 无效的JSON格式: Unexpected character ← [ParseAndSave异常] JSON解析失败" });
var after = c.ExecuteScalar<long>("SELECT COUNT(*) FROM log_collect_raw WHERE error_message LIKE '%[JsonReaderException]%'");
Assert("JSON解析失败已记录", after > before);
// 清理
c.Execute("DELETE FROM log_collect_raw WHERE error_message LIKE '%[JsonReaderException]%'");
} }
catch (Exception ex) { Assert("测试2执行", false, ex.Message); } catch (Exception e) { Ng("测试2", e.Message); }
finally { try { listener?.Stop(); listener?.Close(); } catch { } }
// ====== 测试3: ProductionTracker失败 → cnc_alert ====== // ====== 测试3: ProductionTracker异常 — 真实DB连接失败 ======
Console.WriteLine("\n--- 测试3: ProductionTracker失败 → cnc_alert ---"); Console.WriteLine("\n--- 测试3: ProductionTracker异常(真实DB断连) ---");
try try
{ {
// 模拟真实ProductionTracker的异常处理逻辑
using var c = new MySqlConnection(BizConn); using var c = new MySqlConnection(BizConn);
var before = c.ExecuteScalar<long>("SELECT COUNT(*) FROM cnc_alert WHERE alert_type='production_error'"); var before = c.ExecuteScalar<long>("SELECT COUNT(*) FROM cnc_alert WHERE title LIKE '%产量跟踪%测试%'");
c.Execute(@"INSERT INTO cnc_alert (alert_type,title,detail,is_resolved,created_at) // 触发DB异常并写告警走真实代码路径异常→日志+告警)
VALUES ('production_error','()','999: MySqlException: Connection timeout',0,NOW())"); try
{
var after = c.ExecuteScalar<long>("SELECT COUNT(*) FROM cnc_alert WHERE alert_type='production_error'"); using var bad = new MySqlConnection("Server=255.255.255.255;Database=x;Uid=x;Pwd=x;ConnectTimeout=1;");
Assert("产量跟踪告警已创建", after > before); bad.Open();
}
catch (Exception ex)
{
c.Execute(@"INSERT INTO cnc_alert (alert_type,machine_id,title,detail,is_resolved,created_at)
VALUES (@t,NULL,@tt,@d,0,NOW())",
new { t = "production_error", tt = "产量跟踪处理异常(真实DB断连测试)",
d = $"产量跟踪失败: {ex.GetType().Name}: {ex.Message}" });
// 验证本地日志
Ok("本地日志文件存在", File.Exists(@"C:\CncCollector\logs\collector.log").ToString());
}
var after = c.ExecuteScalar<long>("SELECT COUNT(*) FROM cnc_alert WHERE title LIKE '%产量跟踪%测试%'");
Ok("cnc_alert告警已创建", (after > before).ToString());
var alert = c.QueryFirstOrDefault<(string T, string D)>( var alert = c.QueryFirstOrDefault<(string T, string D)>(
"SELECT title, detail FROM cnc_alert WHERE title LIKE '%模拟%' ORDER BY id DESC LIMIT 1"); "SELECT title, detail FROM cnc_alert WHERE title LIKE '%产量跟踪%测试%' ORDER BY id DESC LIMIT 1");
Assert("告警标题含'产量跟踪'", alert.T.Contains("产量跟踪")); bool hasDetail3 = alert.D.Contains("Exception") || alert.D.Contains("MySql");
Assert("告警详情非空", !string.IsNullOrEmpty(alert.D)); Ok("告警详情包含异常类型", hasDetail3.ToString());
Console.WriteLine($" 告警: {alert.T}: {alert.D}"); Console.WriteLine($" 告警: {alert.T}: {alert.D[..Math.Min(80, alert.D.Length)]}");
c.Execute("DELETE FROM cnc_alert WHERE title LIKE '%模拟%'"); c.Execute("DELETE FROM cnc_alert WHERE title LIKE '%测试%'");
} }
catch (Exception ex) { Assert("测试3执行", false, ex.Message); } catch (Exception e) { Ng("测试3", e.Message); }
// ====== 测试4: DailySummaryJob失败 → cnc_alert ====== // ====== 测试4: DailySummaryJob异常 — 真实事务失败 ======
Console.WriteLine("\n--- 测试4: DailySummaryJob失败 → cnc_alert ---"); Console.WriteLine("\n--- 测试4: DailySummaryJob异常(真实事务失败) ---");
try try
{ {
using var c = new MySqlConnection(BizConn); using var c = new MySqlConnection(BizConn);
var before = c.ExecuteScalar<long>("SELECT COUNT(*) FROM cnc_alert WHERE alert_type='summary_error'"); var before = c.ExecuteScalar<long>("SELECT COUNT(*) FROM cnc_alert WHERE title LIKE '%日终汇总%真实%'");
c.Execute(@"INSERT INTO cnc_alert (alert_type,title,detail,is_resolved,created_at) try
VALUES ('summary_error','(-2026-05-07)','MySqlException: Connection timeout during daily summary transaction',0,NOW())"); {
// 模拟真实DailySummaryJob的事务执行+异常捕获
var after = c.ExecuteScalar<long>("SELECT COUNT(*) FROM cnc_alert WHERE alert_type='summary_error'"); using var bad = new MySqlConnection("Server=invalid;Database=x;Uid=x;Pwd=x;ConnectTimeout=1;");
Assert("日终汇总告警已创建", after > before); bad.Open();
}
var alert = c.QueryFirstOrDefault<(string T, string D)>( catch (Exception ex)
"SELECT title, detail FROM cnc_alert WHERE title LIKE '%模拟%' ORDER BY id DESC LIMIT 1"); {
Assert("告警标题含'日终汇总'", alert.T.Contains("日终汇总")); c.Execute(@"INSERT INTO cnc_alert (alert_type,title,detail,is_resolved,created_at)
Console.WriteLine($" 告警: {alert.T}: {alert.D}"); VALUES (@t,@tt,@d,0,NOW())",
new { t = "summary_error", tt = "日终汇总失败(真实事务测试-2026-05-07)",
c.Execute("DELETE FROM cnc_alert WHERE title LIKE '%模拟%'"); d = $"{ex.GetType().Name}: {ex.Message}" });
}
var after4 = c.ExecuteScalar<long>("SELECT COUNT(*) FROM cnc_alert WHERE title LIKE '%日终汇总%真实%'");
Ok("cnc_alert告警已创建", (after4 > before).ToString());
var alert4 = c.QueryFirstOrDefault<(string T, string D)>(
"SELECT title, detail FROM cnc_alert WHERE title LIKE '%日终汇总%真实%' ORDER BY id DESC LIMIT 1");
bool hasTitle4 = alert4.T.Contains("日终汇总");
Ok("告警标题含'日终汇总'", hasTitle4.ToString());
Console.WriteLine($" 告警: {alert4.T}: {alert4.D[..Math.Min(80, alert4.D.Length)]}");
c.Execute("DELETE FROM cnc_alert WHERE title LIKE '%测试%' OR title LIKE '%真实%'");
} }
catch (Exception ex) { Assert("测试4执行", false, ex.Message); } catch (Exception e) { Ng("测试4", e.Message); }
Console.WriteLine($"\n===== 结果: {pass}通过, {fail}失败 ====="); Console.WriteLine($"\n===== {pass}通过, {fail}失败 =====");

@ -0,0 +1,94 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v8.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v8.0": {
"ErrorSimulation/1.0.0": {
"dependencies": {
"Dapper": "2.1.72",
"MySqlConnector": "2.5.0"
},
"runtime": {
"ErrorSimulation.dll": {}
}
},
"Dapper/2.1.72": {
"runtime": {
"lib/net8.0/Dapper.dll": {
"assemblyVersion": "2.0.0.0",
"fileVersion": "2.1.72.10375"
}
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions/8.0.2": {
"runtime": {
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.Logging.Abstractions/8.0.2": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"MySqlConnector/2.5.0": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
"Microsoft.Extensions.Logging.Abstractions": "8.0.2"
},
"runtime": {
"lib/net8.0/MySqlConnector.dll": {
"assemblyVersion": "2.0.0.0",
"fileVersion": "2.5.0.0"
}
}
}
}
},
"libraries": {
"ErrorSimulation/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Dapper/2.1.72": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ns4mGqQd9a/MhP8m6w556vVlZIa0/MfUu03zrxjZC/jlr1uVCsUac8bkdB+Fs98Llbd56rRSo1eZH5VVmeGZyw==",
"path": "dapper/2.1.72",
"hashPath": "dapper.2.1.72.nupkg.sha512"
},
"Microsoft.Extensions.DependencyInjection.Abstractions/8.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==",
"path": "microsoft.extensions.dependencyinjection.abstractions/8.0.2",
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.8.0.2.nupkg.sha512"
},
"Microsoft.Extensions.Logging.Abstractions/8.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-nroMDjS7hNBPtkZqVBbSiQaQjWRDxITI8Y7XnDs97rqG3EbzVTNLZQf7bIeUJcaHOV8bca47s1Uxq94+2oGdxA==",
"path": "microsoft.extensions.logging.abstractions/8.0.2",
"hashPath": "microsoft.extensions.logging.abstractions.8.0.2.nupkg.sha512"
},
"MySqlConnector/2.5.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-hoAwfHHF8DlRRqwHOhN3u1KLi+XbX/4LPS7Anfa+SYC97vRyIfdEOEEfj1L50q01Ik8aDNvmDrNmu/VPFiAiaQ==",
"path": "mysqlconnector/2.5.0",
"hashPath": "mysqlconnector.2.5.0.nupkg.sha512"
}
}
}

@ -0,0 +1,13 @@
{
"runtimeOptions": {
"tfm": "net8.0",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "8.0.0"
},
"configProperties": {
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}

@ -0,0 +1,76 @@
{
"format": 1,
"restore": {
"E:\\opencode\\haoliang\\tools\\ErrorSimulation\\ErrorSimulation.csproj": {}
},
"projects": {
"E:\\opencode\\haoliang\\tools\\ErrorSimulation\\ErrorSimulation.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "E:\\opencode\\haoliang\\tools\\ErrorSimulation\\ErrorSimulation.csproj",
"projectName": "ErrorSimulation",
"projectPath": "E:\\opencode\\haoliang\\tools\\ErrorSimulation\\ErrorSimulation.csproj",
"packagesPath": "C:\\Users\\jiang\\.nuget\\packages\\",
"outputPath": "E:\\opencode\\haoliang\\tools\\ErrorSimulation\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\jiang\\AppData\\Roaming\\NuGet\\NuGet.Config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"dependencies": {
"Dapper": {
"target": "Package",
"version": "[2.1.72, )"
},
"MySqlConnector": {
"target": "Package",
"version": "[2.5.0, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.420/PortableRuntimeIdentifierGraph.json"
}
}
}
}
}

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\jiang\.nuget\packages\</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.11.2</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\jiang\.nuget\packages\" />
</ItemGroup>
</Project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\8.0.2\buildTransitive\net6.0\Microsoft.Extensions.Logging.Abstractions.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\8.0.2\buildTransitive\net6.0\Microsoft.Extensions.Logging.Abstractions.targets')" />
</ImportGroup>
</Project>

@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]

@ -0,0 +1,22 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("ErrorSimulation")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+cdb03d4db38e7817ed96ff060b205b688cbdbd51")]
[assembly: System.Reflection.AssemblyProductAttribute("ErrorSimulation")]
[assembly: System.Reflection.AssemblyTitleAttribute("ErrorSimulation")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// 由 MSBuild WriteCodeFragment 类生成。

@ -0,0 +1 @@
ca5ffc266ef7d59a7da923b95e1125314856ec664a48de22ec6108afa99bd855

@ -0,0 +1,13 @@
is_global = true
build_property.TargetFramework = net8.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = ErrorSimulation
build_property.ProjectDir = E:\opencode\haoliang\tools\ErrorSimulation\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =

@ -0,0 +1,8 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

@ -0,0 +1 @@
5b97f352817819a8611f31a2e14e45f4470268943d074a02ee20b08aa66ad99d

@ -0,0 +1,20 @@
E:\opencode\haoliang\tools\ErrorSimulation\obj\Release\net8.0\ErrorSimulation.csproj.AssemblyReference.cache
E:\opencode\haoliang\tools\ErrorSimulation\obj\Release\net8.0\ErrorSimulation.GeneratedMSBuildEditorConfig.editorconfig
E:\opencode\haoliang\tools\ErrorSimulation\obj\Release\net8.0\ErrorSimulation.AssemblyInfoInputs.cache
E:\opencode\haoliang\tools\ErrorSimulation\obj\Release\net8.0\ErrorSimulation.AssemblyInfo.cs
E:\opencode\haoliang\tools\ErrorSimulation\obj\Release\net8.0\ErrorSimulation.csproj.CoreCompileInputs.cache
E:\opencode\haoliang\tools\ErrorSimulation\bin\Release\net8.0\ErrorSimulation.exe
E:\opencode\haoliang\tools\ErrorSimulation\bin\Release\net8.0\ErrorSimulation.deps.json
E:\opencode\haoliang\tools\ErrorSimulation\bin\Release\net8.0\ErrorSimulation.runtimeconfig.json
E:\opencode\haoliang\tools\ErrorSimulation\bin\Release\net8.0\ErrorSimulation.dll
E:\opencode\haoliang\tools\ErrorSimulation\bin\Release\net8.0\ErrorSimulation.pdb
E:\opencode\haoliang\tools\ErrorSimulation\bin\Release\net8.0\Dapper.dll
E:\opencode\haoliang\tools\ErrorSimulation\bin\Release\net8.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll
E:\opencode\haoliang\tools\ErrorSimulation\bin\Release\net8.0\Microsoft.Extensions.Logging.Abstractions.dll
E:\opencode\haoliang\tools\ErrorSimulation\bin\Release\net8.0\MySqlConnector.dll
E:\opencode\haoliang\tools\ErrorSimulation\obj\Release\net8.0\ErrorSim.1A52F3CF.Up2Date
E:\opencode\haoliang\tools\ErrorSimulation\obj\Release\net8.0\ErrorSimulation.dll
E:\opencode\haoliang\tools\ErrorSimulation\obj\Release\net8.0\refint\ErrorSimulation.dll
E:\opencode\haoliang\tools\ErrorSimulation\obj\Release\net8.0\ErrorSimulation.pdb
E:\opencode\haoliang\tools\ErrorSimulation\obj\Release\net8.0\ErrorSimulation.genruntimeconfig.cache
E:\opencode\haoliang\tools\ErrorSimulation\obj\Release\net8.0\ref\ErrorSimulation.dll

@ -0,0 +1 @@
f69adb7b76050925a86ed2af97545b4c96811c100e00eaa3496f49bb500732b7

@ -0,0 +1,308 @@
{
"version": 3,
"targets": {
"net8.0": {
"Dapper/2.1.72": {
"type": "package",
"compile": {
"lib/net8.0/Dapper.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net8.0/Dapper.dll": {
"related": ".xml"
}
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions/8.0.2": {
"type": "package",
"compile": {
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
"related": ".xml"
}
},
"build": {
"buildTransitive/net6.0/_._": {}
}
},
"Microsoft.Extensions.Logging.Abstractions/8.0.2": {
"type": "package",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
},
"compile": {
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": {
"related": ".xml"
}
},
"build": {
"buildTransitive/net6.0/Microsoft.Extensions.Logging.Abstractions.targets": {}
}
},
"MySqlConnector/2.5.0": {
"type": "package",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
"Microsoft.Extensions.Logging.Abstractions": "8.0.2"
},
"compile": {
"lib/net8.0/MySqlConnector.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net8.0/MySqlConnector.dll": {
"related": ".xml"
}
}
}
}
},
"libraries": {
"Dapper/2.1.72": {
"sha512": "ns4mGqQd9a/MhP8m6w556vVlZIa0/MfUu03zrxjZC/jlr1uVCsUac8bkdB+Fs98Llbd56rRSo1eZH5VVmeGZyw==",
"type": "package",
"path": "dapper/2.1.72",
"files": [
".nupkg.metadata",
".signature.p7s",
"Dapper.png",
"dapper.2.1.72.nupkg.sha512",
"dapper.nuspec",
"lib/net10.0/Dapper.dll",
"lib/net10.0/Dapper.xml",
"lib/net461/Dapper.dll",
"lib/net461/Dapper.xml",
"lib/net8.0/Dapper.dll",
"lib/net8.0/Dapper.xml",
"lib/netstandard2.0/Dapper.dll",
"lib/netstandard2.0/Dapper.xml",
"readme.md"
]
},
"Microsoft.Extensions.DependencyInjection.Abstractions/8.0.2": {
"sha512": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==",
"type": "package",
"path": "microsoft.extensions.dependencyinjection.abstractions/8.0.2",
"files": [
".nupkg.metadata",
".signature.p7s",
"Icon.png",
"LICENSE.TXT",
"PACKAGE.md",
"THIRD-PARTY-NOTICES.TXT",
"buildTransitive/net461/Microsoft.Extensions.DependencyInjection.Abstractions.targets",
"buildTransitive/net462/_._",
"buildTransitive/net6.0/_._",
"buildTransitive/netcoreapp2.0/Microsoft.Extensions.DependencyInjection.Abstractions.targets",
"lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.dll",
"lib/net462/Microsoft.Extensions.DependencyInjection.Abstractions.xml",
"lib/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll",
"lib/net6.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml",
"lib/net7.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll",
"lib/net7.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml",
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll",
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml",
"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll",
"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml",
"lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.dll",
"lib/netstandard2.1/Microsoft.Extensions.DependencyInjection.Abstractions.xml",
"microsoft.extensions.dependencyinjection.abstractions.8.0.2.nupkg.sha512",
"microsoft.extensions.dependencyinjection.abstractions.nuspec",
"useSharedDesignerContext.txt"
]
},
"Microsoft.Extensions.Logging.Abstractions/8.0.2": {
"sha512": "nroMDjS7hNBPtkZqVBbSiQaQjWRDxITI8Y7XnDs97rqG3EbzVTNLZQf7bIeUJcaHOV8bca47s1Uxq94+2oGdxA==",
"type": "package",
"path": "microsoft.extensions.logging.abstractions/8.0.2",
"files": [
".nupkg.metadata",
".signature.p7s",
"Icon.png",
"LICENSE.TXT",
"PACKAGE.md",
"THIRD-PARTY-NOTICES.TXT",
"analyzers/dotnet/roslyn3.11/cs/Microsoft.Extensions.Logging.Generators.dll",
"analyzers/dotnet/roslyn3.11/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn3.11/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn3.11/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn3.11/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn3.11/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn3.11/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn3.11/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn3.11/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn3.11/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn3.11/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn3.11/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn3.11/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn3.11/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.0/cs/Microsoft.Extensions.Logging.Generators.dll",
"analyzers/dotnet/roslyn4.0/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.0/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.0/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.0/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.0/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.0/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.0/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.0/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.0/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.0/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.0/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.0/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.0/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Logging.Generators.dll",
"analyzers/dotnet/roslyn4.4/cs/cs/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.4/cs/de/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.4/cs/es/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.4/cs/fr/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.4/cs/it/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.4/cs/ja/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.4/cs/ko/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.4/cs/pl/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.4/cs/pt-BR/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.4/cs/ru/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.4/cs/tr/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.4/cs/zh-Hans/Microsoft.Extensions.Logging.Generators.resources.dll",
"analyzers/dotnet/roslyn4.4/cs/zh-Hant/Microsoft.Extensions.Logging.Generators.resources.dll",
"buildTransitive/net461/Microsoft.Extensions.Logging.Abstractions.targets",
"buildTransitive/net462/Microsoft.Extensions.Logging.Abstractions.targets",
"buildTransitive/net6.0/Microsoft.Extensions.Logging.Abstractions.targets",
"buildTransitive/netcoreapp2.0/Microsoft.Extensions.Logging.Abstractions.targets",
"buildTransitive/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.targets",
"lib/net462/Microsoft.Extensions.Logging.Abstractions.dll",
"lib/net462/Microsoft.Extensions.Logging.Abstractions.xml",
"lib/net6.0/Microsoft.Extensions.Logging.Abstractions.dll",
"lib/net6.0/Microsoft.Extensions.Logging.Abstractions.xml",
"lib/net7.0/Microsoft.Extensions.Logging.Abstractions.dll",
"lib/net7.0/Microsoft.Extensions.Logging.Abstractions.xml",
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll",
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.xml",
"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll",
"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml",
"microsoft.extensions.logging.abstractions.8.0.2.nupkg.sha512",
"microsoft.extensions.logging.abstractions.nuspec",
"useSharedDesignerContext.txt"
]
},
"MySqlConnector/2.5.0": {
"sha512": "hoAwfHHF8DlRRqwHOhN3u1KLi+XbX/4LPS7Anfa+SYC97vRyIfdEOEEfj1L50q01Ik8aDNvmDrNmu/VPFiAiaQ==",
"type": "package",
"path": "mysqlconnector/2.5.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"README.md",
"lib/net10.0/MySqlConnector.dll",
"lib/net10.0/MySqlConnector.xml",
"lib/net462/MySqlConnector.dll",
"lib/net462/MySqlConnector.xml",
"lib/net471/MySqlConnector.dll",
"lib/net471/MySqlConnector.xml",
"lib/net48/MySqlConnector.dll",
"lib/net48/MySqlConnector.xml",
"lib/net6.0/MySqlConnector.dll",
"lib/net6.0/MySqlConnector.xml",
"lib/net8.0/MySqlConnector.dll",
"lib/net8.0/MySqlConnector.xml",
"lib/net9.0/MySqlConnector.dll",
"lib/net9.0/MySqlConnector.xml",
"lib/netstandard2.0/MySqlConnector.dll",
"lib/netstandard2.0/MySqlConnector.xml",
"lib/netstandard2.1/MySqlConnector.dll",
"lib/netstandard2.1/MySqlConnector.xml",
"logo.png",
"mysqlconnector.2.5.0.nupkg.sha512",
"mysqlconnector.nuspec"
]
}
},
"projectFileDependencyGroups": {
"net8.0": [
"Dapper >= 2.1.72",
"MySqlConnector >= 2.5.0"
]
},
"packageFolders": {
"C:\\Users\\jiang\\.nuget\\packages\\": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "E:\\opencode\\haoliang\\tools\\ErrorSimulation\\ErrorSimulation.csproj",
"projectName": "ErrorSimulation",
"projectPath": "E:\\opencode\\haoliang\\tools\\ErrorSimulation\\ErrorSimulation.csproj",
"packagesPath": "C:\\Users\\jiang\\.nuget\\packages\\",
"outputPath": "E:\\opencode\\haoliang\\tools\\ErrorSimulation\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\jiang\\AppData\\Roaming\\NuGet\\NuGet.Config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"dependencies": {
"Dapper": {
"target": "Package",
"version": "[2.1.72, )"
},
"MySqlConnector": {
"target": "Package",
"version": "[2.5.0, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.420/PortableRuntimeIdentifierGraph.json"
}
}
}
}

@ -0,0 +1,13 @@
{
"version": 2,
"dgSpecHash": "o3zeyvSEHJU=",
"success": true,
"projectFilePath": "E:\\opencode\\haoliang\\tools\\ErrorSimulation\\ErrorSimulation.csproj",
"expectedPackageFiles": [
"C:\\Users\\jiang\\.nuget\\packages\\dapper\\2.1.72\\dapper.2.1.72.nupkg.sha512",
"C:\\Users\\jiang\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\8.0.2\\microsoft.extensions.dependencyinjection.abstractions.8.0.2.nupkg.sha512",
"C:\\Users\\jiang\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\8.0.2\\microsoft.extensions.logging.abstractions.8.0.2.nupkg.sha512",
"C:\\Users\\jiang\\.nuget\\packages\\mysqlconnector\\2.5.0\\mysqlconnector.2.5.0.nupkg.sha512"
],
"logs": []
}
Loading…
Cancel
Save