parent
dc1aa3b09f
commit
14e7f75512
|
|
@ -180,7 +180,6 @@ namespace Waste.Application
|
||||||
}
|
}
|
||||||
var typeHex = Convert.ToHexString(typeBytes);
|
var typeHex = Convert.ToHexString(typeBytes);
|
||||||
myPackage.Area = Convert.ToInt32(typeHex, 16).ToString();
|
myPackage.Area = Convert.ToInt32(typeHex, 16).ToString();
|
||||||
//十六进制转10进制
|
|
||||||
}
|
}
|
||||||
//000F000002.16进制
|
//000F000002.16进制
|
||||||
var areaHex = Convert.ToHexString(areaBytes);
|
var areaHex = Convert.ToHexString(areaBytes);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,99 @@
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Serilog;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Waste.Core
|
||||||
|
{
|
||||||
|
public static class LoggerHelper
|
||||||
|
{
|
||||||
|
public static void EnrichFromRequest(IDiagnosticContext diagnosticContext, HttpContext httpContext)
|
||||||
|
{
|
||||||
|
var request = httpContext.Request;
|
||||||
|
|
||||||
|
// Set all the common properties available for every request
|
||||||
|
diagnosticContext.Set("Host", request.Host);
|
||||||
|
diagnosticContext.Set("Scheme", request.Scheme);
|
||||||
|
|
||||||
|
// Only set it if available. You're not sending sensitive data in a querystring right?!
|
||||||
|
if (request.QueryString.HasValue)
|
||||||
|
{
|
||||||
|
diagnosticContext.Set("QueryString", request.QueryString.Value);
|
||||||
|
}
|
||||||
|
string ip = string.Empty;
|
||||||
|
if (request.Headers.ContainsKey("X-Real-IP"))
|
||||||
|
{
|
||||||
|
ip = request.Headers["X-Real-IP"].ToString();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ip = httpContext.Connection.RemoteIpAddress.ToString();
|
||||||
|
}
|
||||||
|
if (!string.IsNullOrEmpty(ip))
|
||||||
|
{
|
||||||
|
diagnosticContext.Set("IP", ip);
|
||||||
|
}
|
||||||
|
if (!string.IsNullOrEmpty(request.Headers["token"].ToString()))
|
||||||
|
{
|
||||||
|
diagnosticContext.Set("token", request.Headers["token"].ToString());
|
||||||
|
}
|
||||||
|
if (!string.IsNullOrEmpty(request.Headers["Authorization"].ToString()))
|
||||||
|
{
|
||||||
|
diagnosticContext.Set("Authorization", request.Headers["Authorization"].ToString());
|
||||||
|
}
|
||||||
|
if (!string.IsNullOrEmpty(request.Headers["X-Authorization"].ToString()))
|
||||||
|
{
|
||||||
|
diagnosticContext.Set("X-Authorization", request.Headers["X-Authorization"].ToString());
|
||||||
|
}
|
||||||
|
if (!string.IsNullOrEmpty(request.Headers["User-Agent"].ToString()))
|
||||||
|
{
|
||||||
|
diagnosticContext.Set("User-Agent", request.Headers["User-Agent"].ToString());
|
||||||
|
}
|
||||||
|
if (request.Method == "POST" && request.ContentLength > 0)
|
||||||
|
{
|
||||||
|
if (httpContext.RequestAborted.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
diagnosticContext.Set("postdata", "用户取消了操作");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string postdata = string.Empty;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (request.Body.Length > 0)
|
||||||
|
{
|
||||||
|
request.EnableBuffering();
|
||||||
|
request.Body.Position = 0;
|
||||||
|
using (var sr = new StreamReader(request.Body))
|
||||||
|
{
|
||||||
|
postdata = Task.Factory.StartNew(sr.ReadToEndAsync, TaskCreationOptions.LongRunning)
|
||||||
|
.GetAwaiter().GetResult().Result;
|
||||||
|
// postdata = await sr.ReadToEndAsync();
|
||||||
|
}
|
||||||
|
if (!string.IsNullOrEmpty(postdata))
|
||||||
|
{
|
||||||
|
diagnosticContext.Set("PostData", postdata);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Set the content-type of the Response at this point
|
||||||
|
diagnosticContext.Set("ContentType", httpContext.Response.ContentType);
|
||||||
|
|
||||||
|
// Retrieve the IEndpointFeature selected for the request
|
||||||
|
var endpoint = httpContext.GetEndpoint();
|
||||||
|
if (endpoint is object) // endpoint != null
|
||||||
|
{
|
||||||
|
diagnosticContext.Set("EndpointName", endpoint.DisplayName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -15,11 +15,11 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Furion" Version="2.7.9" />
|
<PackageReference Include="Furion" Version="2.15.10" />
|
||||||
<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="2.7.9" />
|
<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="2.15.10" />
|
||||||
<PackageReference Include="Furion.Extras.DatabaseAccessor.SqlSugar" Version="2.7.9" />
|
<PackageReference Include="Furion.Extras.DatabaseAccessor.SqlSugar" Version="2.15.10" />
|
||||||
<PackageReference Include="Furion.Extras.Logging.Serilog" Version="2.7.9" />
|
<PackageReference Include="Furion.Extras.Logging.Serilog" Version="2.15.10" />
|
||||||
<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="2.7.9" />
|
<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="2.15.10" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
using Furion.DataValidation;
|
using Furion.DataValidation;
|
||||||
using Furion.DependencyInjection;
|
using Furion.DependencyInjection;
|
||||||
using Furion.UnifyResult;
|
using Furion.UnifyResult;
|
||||||
|
using Furion.UnifyResult.Internal;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
using Microsoft.AspNetCore.Mvc.Filters;
|
||||||
|
|
@ -16,18 +17,22 @@ namespace Waste.Web.Core
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// RESTFUL 风格返回值
|
/// RESTFUL 风格返回值
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SkipScan, UnifyModel(typeof(RESTfulResult<>))]
|
[SuppressSniffer, UnifyModel(typeof(RESTfulResult<>))]
|
||||||
public class RESTfulResultProvider : IUnifyResultProvider
|
public class RESTfulResultProvider : IUnifyResultProvider
|
||||||
{
|
{
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 异常返回值
|
/// 异常返回值
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context"></param>
|
/// <param name="context"></param>
|
||||||
|
/// <param name="metadata"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public IActionResult OnException(ExceptionContext context)
|
public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
|
||||||
{
|
{
|
||||||
//解析异常信息
|
//解析异常信息
|
||||||
var (StatusCode, ErrorCode, Errors) = UnifyContext.GetExceptionMetadata(context);
|
var ErrorCode = metadata.ErrorCode;
|
||||||
|
var StatusCode = metadata.StatusCode;
|
||||||
|
var Errors = metadata.Errors;
|
||||||
object data;
|
object data;
|
||||||
// 处理内容结果
|
// 处理内容结果
|
||||||
if (context.Result is ContentResult contentResult) data = contentResult.Content;
|
if (context.Result is ContentResult contentResult) data = contentResult.Content;
|
||||||
|
|
@ -50,10 +55,12 @@ namespace Waste.Web.Core
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context"></param>
|
/// <param name="context"></param>
|
||||||
/// <param name="statusCode"></param>
|
/// <param name="statusCode"></param>
|
||||||
/// <param name="options"></param>
|
/// <param name="unifyResultSettings"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultStatusCodesOptions options = null)
|
public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings)
|
||||||
{
|
{
|
||||||
|
// 设置响应状态码
|
||||||
|
UnifyContext.SetResponseStatusCodes(context, statusCode, unifyResultSettings);
|
||||||
switch (statusCode)
|
switch (statusCode)
|
||||||
{
|
{
|
||||||
// 处理 401 状态码
|
// 处理 401 状态码
|
||||||
|
|
@ -90,10 +97,10 @@ namespace Waste.Web.Core
|
||||||
/// 成功返回值
|
/// 成功返回值
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context"></param>
|
/// <param name="context"></param>
|
||||||
|
/// <param name="data"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public IActionResult OnSucceeded(ActionExecutedContext context)
|
public IActionResult OnSucceeded(ActionExecutedContext context, object data)
|
||||||
{
|
{
|
||||||
object data;
|
|
||||||
// 处理内容结果
|
// 处理内容结果
|
||||||
if (context.Result is ContentResult contentResult) data = contentResult.Content;
|
if (context.Result is ContentResult contentResult) data = contentResult.Content;
|
||||||
// 处理对象结果
|
// 处理对象结果
|
||||||
|
|
@ -115,18 +122,26 @@ namespace Waste.Web.Core
|
||||||
/// 验证失败返回值
|
/// 验证失败返回值
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context"></param>
|
/// <param name="context"></param>
|
||||||
/// <param name="modelStates"></param>
|
/// <param name="metadata"></param>
|
||||||
/// <param name="validationResults"></param>
|
|
||||||
/// <param name="validateFailedMessage"></param>
|
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public IActionResult OnValidateFailed(ActionExecutingContext context, ModelStateDictionary modelStates, IEnumerable<ValidateFailedModel> validationResults, string validateFailedMessage)
|
public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata)
|
||||||
{
|
{
|
||||||
|
var msg = "发生错误";
|
||||||
|
var validationResults = metadata.ValidationResult;
|
||||||
|
if (validationResults != null && validationResults.Count() > 0)
|
||||||
|
{
|
||||||
|
var messages = validationResults.FirstOrDefault().Value;
|
||||||
|
if (messages.Length > 0)
|
||||||
|
{
|
||||||
|
msg = messages[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
return new JsonResult(new RESTfulResult<object>
|
return new JsonResult(new RESTfulResult<object>
|
||||||
{
|
{
|
||||||
StatusCode = StatusCodes.Status400BadRequest,
|
StatusCode = StatusCodes.Status400BadRequest,
|
||||||
Succeeded = false,
|
Succeeded = false,
|
||||||
Data = null,
|
Data = null,
|
||||||
Errors = validationResults,
|
Errors = msg,
|
||||||
Extras = UnifyContext.Take(),
|
Extras = UnifyContext.Take(),
|
||||||
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
|
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ using Nirvana.Common;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Waste.Core;
|
||||||
|
|
||||||
namespace Waste.Web.Core
|
namespace Waste.Web.Core
|
||||||
{
|
{
|
||||||
|
|
@ -68,7 +69,9 @@ namespace Waste.Web.Core
|
||||||
app.UseHttpsRedirection();
|
app.UseHttpsRedirection();
|
||||||
|
|
||||||
app.UseStaticFiles();
|
app.UseStaticFiles();
|
||||||
app.UseSerilogRequestLogging(); //记录请求日志,必须在 UseStaticFiles 和 UseRouting 之间
|
app.UseSerilogRequestLogging(opts => {
|
||||||
|
opts.EnrichDiagnosticContext = LoggerHelper.EnrichFromRequest;
|
||||||
|
}); // 必须在 UseStaticFiles 和 UseRouting 之间,记录请求日志
|
||||||
app.UseRouting();
|
app.UseRouting();
|
||||||
|
|
||||||
app.UseCorsAccessor();
|
app.UseCorsAccessor();
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.5" />
|
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.5" />
|
||||||
|
<PackageReference Include="Serilog.Sinks.Seq" Version="5.0.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
||||||
|
|
@ -88,37 +88,37 @@
|
||||||
RESTFUL 风格返回值
|
RESTFUL 风格返回值
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Waste.Web.Core.RESTfulResultProvider.OnException(Microsoft.AspNetCore.Mvc.Filters.ExceptionContext)">
|
<member name="M:Waste.Web.Core.RESTfulResultProvider.OnException(Microsoft.AspNetCore.Mvc.Filters.ExceptionContext,Furion.UnifyResult.Internal.ExceptionMetadata)">
|
||||||
<summary>
|
<summary>
|
||||||
异常返回值
|
异常返回值
|
||||||
</summary>
|
</summary>
|
||||||
<param name="context"></param>
|
<param name="context"></param>
|
||||||
|
<param name="metadata"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Waste.Web.Core.RESTfulResultProvider.OnResponseStatusCodes(Microsoft.AspNetCore.Http.HttpContext,System.Int32,Furion.UnifyResult.UnifyResultStatusCodesOptions)">
|
<member name="M:Waste.Web.Core.RESTfulResultProvider.OnResponseStatusCodes(Microsoft.AspNetCore.Http.HttpContext,System.Int32,Furion.UnifyResult.UnifyResultSettingsOptions)">
|
||||||
<summary>
|
<summary>
|
||||||
处理输出状态码
|
处理输出状态码
|
||||||
</summary>
|
</summary>
|
||||||
<param name="context"></param>
|
<param name="context"></param>
|
||||||
<param name="statusCode"></param>
|
<param name="statusCode"></param>
|
||||||
<param name="options"></param>
|
<param name="unifyResultSettings"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Waste.Web.Core.RESTfulResultProvider.OnSucceeded(Microsoft.AspNetCore.Mvc.Filters.ActionExecutedContext)">
|
<member name="M:Waste.Web.Core.RESTfulResultProvider.OnSucceeded(Microsoft.AspNetCore.Mvc.Filters.ActionExecutedContext,System.Object)">
|
||||||
<summary>
|
<summary>
|
||||||
成功返回值
|
成功返回值
|
||||||
</summary>
|
</summary>
|
||||||
<param name="context"></param>
|
<param name="context"></param>
|
||||||
|
<param name="data"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Waste.Web.Core.RESTfulResultProvider.OnValidateFailed(Microsoft.AspNetCore.Mvc.Filters.ActionExecutingContext,Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary,System.Collections.Generic.IEnumerable{Furion.DataValidation.ValidateFailedModel},System.String)">
|
<member name="M:Waste.Web.Core.RESTfulResultProvider.OnValidateFailed(Microsoft.AspNetCore.Mvc.Filters.ActionExecutingContext,Furion.DataValidation.ValidationMetadata)">
|
||||||
<summary>
|
<summary>
|
||||||
验证失败返回值
|
验证失败返回值
|
||||||
</summary>
|
</summary>
|
||||||
<param name="context"></param>
|
<param name="context"></param>
|
||||||
<param name="modelStates"></param>
|
<param name="metadata"></param>
|
||||||
<param name="validationResults"></param>
|
|
||||||
<param name="validateFailedMessage"></param>
|
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
</members>
|
</members>
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ namespace Waste.Web.Entry
|
||||||
new string('-', 50);//输出模板
|
new string('-', 50);//输出模板
|
||||||
///1.输出所有restrictedToMinimumLevel:LogEventLevel类型
|
///1.输出所有restrictedToMinimumLevel:LogEventLevel类型
|
||||||
config
|
config
|
||||||
|
.WriteTo.Seq("http://localhost:5341/")
|
||||||
//.MinimumLevel.Debug() // 所有Sink的最小记录级别
|
//.MinimumLevel.Debug() // 所有Sink的最小记录级别
|
||||||
//.MinimumLevel.Override("Microsoft", LogEventLevel.Fatal)
|
//.MinimumLevel.Override("Microsoft", LogEventLevel.Fatal)
|
||||||
//.Enrich.FromLogContext()
|
//.Enrich.FromLogContext()
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,6 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<_PublishTargetUrl>D:\webpublish\waste.ybhdmob.com</_PublishTargetUrl>
|
<_PublishTargetUrl>D:\webpublish\waste.ybhdmob.com</_PublishTargetUrl>
|
||||||
<History>True|2021-07-29T11:06:09.1449349Z;True|2021-06-11T08:16:29.9542894+08:00;True|2021-06-04T14:46:02.2707457+08:00;True|2021-06-02T15:08:52.8245632+08:00;True|2021-06-02T15:05:50.3614099+08:00;True|2021-06-02T14:59:32.3690948+08:00;True|2021-06-02T14:10:25.1182836+08:00;True|2021-06-02T14:09:54.9215833+08:00;True|2021-06-01T10:41:54.9488501+08:00;True|2021-06-01T10:38:56.0283198+08:00;True|2021-05-28T13:59:02.2308877+08:00;True|2021-05-28T11:56:26.6796406+08:00;True|2021-05-28T11:28:00.4087907+08:00;True|2021-05-27T16:18:09.5993838+08:00;True|2021-05-27T16:07:31.3484951+08:00;True|2021-05-27T11:30:37.9119310+08:00;True|2021-05-27T11:28:35.5374674+08:00;True|2021-05-27T08:00:09.1625592+08:00;True|2021-05-26T20:42:17.0852150+08:00;True|2021-05-26T20:36:49.7527415+08:00;True|2021-05-25T17:57:31.8791293+08:00;True|2021-05-25T13:49:29.6488978+08:00;True|2021-05-25T13:48:24.6686105+08:00;True|2021-05-25T13:25:41.2512493+08:00;True|2021-05-24T17:55:33.3800078+08:00;True|2021-05-20T14:35:30.6957985+08:00;True|2021-05-20T13:17:22.6192995+08:00;True|2021-05-20T10:51:38.1268169+08:00;True|2021-05-19T19:50:03.7000224+08:00;True|2021-05-19T19:44:27.2518811+08:00;True|2021-05-19T19:43:26.5916681+08:00;True|2021-05-19T19:36:29.3197365+08:00;True|2021-05-19T19:30:00.3802430+08:00;True|2021-05-19T17:55:23.7939835+08:00;True|2021-05-19T11:05:17.9043392+08:00;True|2021-05-19T10:19:38.4839988+08:00;True|2021-05-19T10:17:19.7430612+08:00;True|2021-05-19T10:13:23.0031721+08:00;True|2021-05-19T10:06:03.9881599+08:00;True|2021-05-18T14:39:03.8876574+08:00;True|2021-05-18T14:23:46.9818836+08:00;True|2021-05-18T14:19:56.2382079+08:00;True|2021-05-18T11:29:53.5497590+08:00;True|2021-05-18T11:16:18.0123853+08:00;True|2021-05-17T18:59:52.4159105+08:00;True|2021-05-17T18:53:37.9438984+08:00;True|2021-05-17T18:48:14.9625161+08:00;True|2021-05-17T17:46:03.7723404+08:00;True|2021-05-17T17:14:20.2312990+08:00;True|2021-05-17T16:44:34.5837616+08:00;True|2021-05-17T16:25:20.1087804+08:00;True|2021-05-17T11:35:27.9388562+08:00;</History>
|
<History>True|2021-07-30T01:32:38.2676032Z;True|2021-07-30T09:14:42.6170851+08:00;True|2021-07-29T19:06:09.1449349+08:00;True|2021-06-11T08:16:29.9542894+08:00;True|2021-06-04T14:46:02.2707457+08:00;True|2021-06-02T15:08:52.8245632+08:00;True|2021-06-02T15:05:50.3614099+08:00;True|2021-06-02T14:59:32.3690948+08:00;True|2021-06-02T14:10:25.1182836+08:00;True|2021-06-02T14:09:54.9215833+08:00;True|2021-06-01T10:41:54.9488501+08:00;True|2021-06-01T10:38:56.0283198+08:00;True|2021-05-28T13:59:02.2308877+08:00;True|2021-05-28T11:56:26.6796406+08:00;True|2021-05-28T11:28:00.4087907+08:00;True|2021-05-27T16:18:09.5993838+08:00;True|2021-05-27T16:07:31.3484951+08:00;True|2021-05-27T11:30:37.9119310+08:00;True|2021-05-27T11:28:35.5374674+08:00;True|2021-05-27T08:00:09.1625592+08:00;True|2021-05-26T20:42:17.0852150+08:00;True|2021-05-26T20:36:49.7527415+08:00;True|2021-05-25T17:57:31.8791293+08:00;True|2021-05-25T13:49:29.6488978+08:00;True|2021-05-25T13:48:24.6686105+08:00;True|2021-05-25T13:25:41.2512493+08:00;True|2021-05-24T17:55:33.3800078+08:00;True|2021-05-20T14:35:30.6957985+08:00;True|2021-05-20T13:17:22.6192995+08:00;True|2021-05-20T10:51:38.1268169+08:00;True|2021-05-19T19:50:03.7000224+08:00;True|2021-05-19T19:44:27.2518811+08:00;True|2021-05-19T19:43:26.5916681+08:00;True|2021-05-19T19:36:29.3197365+08:00;True|2021-05-19T19:30:00.3802430+08:00;True|2021-05-19T17:55:23.7939835+08:00;True|2021-05-19T11:05:17.9043392+08:00;True|2021-05-19T10:19:38.4839988+08:00;True|2021-05-19T10:17:19.7430612+08:00;True|2021-05-19T10:13:23.0031721+08:00;True|2021-05-19T10:06:03.9881599+08:00;True|2021-05-18T14:39:03.8876574+08:00;True|2021-05-18T14:23:46.9818836+08:00;True|2021-05-18T14:19:56.2382079+08:00;True|2021-05-18T11:29:53.5497590+08:00;True|2021-05-18T11:16:18.0123853+08:00;True|2021-05-17T18:59:52.4159105+08:00;True|2021-05-17T18:53:37.9438984+08:00;True|2021-05-17T18:48:14.9625161+08:00;True|2021-05-17T17:46:03.7723404+08:00;True|2021-05-17T17:14:20.2312990+08:00;True|2021-05-17T16:44:34.5837616+08:00;True|2021-05-17T16:25:20.1087804+08:00;True|2021-05-17T11:35:27.9388562+08:00;</History>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
||||||
Loading…
Reference in New Issue