Skip to content
Open
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Copilot Instructions

在每次任务完成之后,应该总结经验且更新此文档内容

## 现代化改造经验总结

本项目在现代化改造中,建议持续遵循以下实践:

1. 网络层统一使用 `HttpClient` + `HttpRequestMessage`,避免 `HttpWebRequest`。
2. JSON 处理优先使用 `System.Text.Json`,并尽量配合源生成上下文(`JsonSerializerContext`)提升 AOT 兼容性。
3. 对关键入参增加早期校验(如 `ArgumentNullException.ThrowIfNull` / `ArgumentException.ThrowIfNullOrWhiteSpace`),减少隐式空引用风险。
4. 常用集合初始化时尽量预估容量(如 `new List<T>(count)`、`new Dictionary<TKey, TValue>(capacity)`),减少扩容开销。
5. 字符串拼接优先使用内插字符串(`$"..."`),替代 `string.Format`,可读性更高。
6. 属性、方法、字段、类型名等的命名需要符合 C# 命名规范,例如:
- 属性、方法、类型名应该使用 PascalCasing 命名风格
- 局部变量应该使用 camelCase 命名风格
- 字段应该使用 `_camelCase` 风格,而且尽可能使用 `readonly ` 标记只读。
7. 最好不要公开字段,请封装为属性进行公开
8. 考虑可空。但可以对进行网络请求的纯数据结构放宽要求
9. 结果模型统一走 `QiniuJson` + `JsonSerializerContext`,减少反射序列化路径
10. 旧 API 的命名保留兼容入口(`[Obsolete]`),新增规范命名 API 并逐步迁移
11. 禁止通过伪造兼容层保留 `Newtonsoft` 特性;应直接迁移为 `System.Text.Json` 特性与 API
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

5. 然后到 github 网站的该 git 远程仓库的 my-new-feature 分支下发起 Pull Request


## 许可证

Copyright (c) 2017 [qiniu.com](www.qiniu.com)
10 changes: 8 additions & 2 deletions src/Qiniu.sln
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29102.190
# Visual Studio Version 18
VisualStudioVersion = 18.3.11512.155 d18.3
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Qiniu", "Qiniu\Qiniu.csproj", "{2F5B0328-DE8B-4B53-A500-3077E340A51B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QiniuTests", "QiniuTests\QiniuTests.csproj", "{E8CB1665-53F7-46A5-9AFD-B85AD08262D0}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{552C1A84-F05A-4364-B6FC-41695F015CF8}"
ProjectSection(SolutionItems) = preProject
..\.github\copilot-instructions.md = ..\.github\copilot-instructions.md
..\README.md = ..\README.md
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down
13 changes: 7 additions & 6 deletions src/Qiniu/CDN/BandwidthRequest.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
using Qiniu.Util;
namespace Qiniu.CDN
{
/// <summary>
Expand All @@ -9,25 +10,25 @@ public class BandwidthRequest
/// <summary>
/// 起始日期,例如2016-09-01
/// </summary>
[JsonProperty("startDate")]
[JsonPropertyName("startDate")]
public string StartDate { get; set; }

/// <summary>
/// 结束日期,例如2016-09-10
/// </summary>
[JsonProperty("endDate")]
[JsonPropertyName("endDate")]
public string EndDate { get; set; }

/// <summary>
/// 时间粒度((取值:5min / hour /day))
/// </summary>
[JsonProperty("granularity")]
[JsonPropertyName("granularity")]
public string Granularity { get; set; }

/// <summary>
/// 域名列表,以西文半角分号分割
/// </summary>
[JsonProperty("domains")]
[JsonPropertyName("domains")]
public string Domains { get; set; }

/// <summary>
Expand Down Expand Up @@ -62,7 +63,7 @@ public BandwidthRequest(string startDate, string endDate, string granularity, st
/// <returns>请求内容的JSON字符串</returns>
public string ToJsonStr()
{
return JsonConvert.SerializeObject(this);
return QiniuJson.Serialize(this, QiniuJson.SerializerContext.BandwidthRequest);
}
}
}
8 changes: 4 additions & 4 deletions src/Qiniu/CDN/BandwidthResult.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using System.Text;
using Newtonsoft.Json;
using Qiniu.Http;
using Qiniu.Util;

namespace Qiniu.CDN
{
Expand All @@ -12,14 +12,14 @@ public class BandwidthResult : HttpResult
/// <summary>
/// 获取带宽信息
/// </summary>
public BandwidthInfo Result
public BandwidthInfo? Result
{
get
{
BandwidthInfo info = null;
BandwidthInfo? info = null;
if ((Code == (int)HttpCode.OK) && (!string.IsNullOrEmpty(Text)))
{
info = JsonConvert.DeserializeObject<BandwidthInfo>(Text);
info = QiniuJson.Deserialize(Text, QiniuJson.SerializerContext.BandwidthInfo);
}
return info;
}
Expand Down
13 changes: 7 additions & 6 deletions src/Qiniu/CDN/FluxRequest.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
using Qiniu.Util;
namespace Qiniu.CDN
{
/// <summary>
Expand All @@ -9,25 +10,25 @@ public class FluxRequest
/// <summary>
/// 起始日期,例如2016-09-01
/// </summary>
[JsonProperty("startDate")]
[JsonPropertyName("startDate")]
public string StartDate { get; set; }

/// <summary>
/// 结束日期,例如2016-09-10
/// </summary>
[JsonProperty("endDate")]
[JsonPropertyName("endDate")]
public string EndDate { get; set; }

/// <summary>
/// 时间粒度((取值:5min / hour /day))
/// </summary>
[JsonProperty("granularity")]
[JsonPropertyName("granularity")]
public string Granularity { get; set; }

/// <summary>
/// 域名列表,以西文半角分号分割
/// </summary>
[JsonProperty("domains")]
[JsonPropertyName("domains")]
public string Domains { get; set; }

/// <summary>
Expand Down Expand Up @@ -62,7 +63,7 @@ public FluxRequest(string startDate, string endDate, string granularity, string
/// <returns>请求内容的JSON字符串</returns>
public string ToJsonStr()
{
return JsonConvert.SerializeObject(this);
return QiniuJson.Serialize(this, QiniuJson.SerializerContext.FluxRequest);
}
}
}
8 changes: 4 additions & 4 deletions src/Qiniu/CDN/FluxResult.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using System.Text;
using Newtonsoft.Json;
using Qiniu.Http;
using Qiniu.Util;

namespace Qiniu.CDN
{
Expand All @@ -12,14 +12,14 @@ public class FluxResult : HttpResult
/// <summary>
/// 获取流量信息
/// </summary>
public FluxInfo Result
public FluxInfo? Result
{
get
{
FluxInfo info = null;
FluxInfo? info = null;
if ((Code == (int)HttpCode.OK) && (!string.IsNullOrEmpty(Text)))
{
info=JsonConvert.DeserializeObject<FluxInfo>(Text);
info = QiniuJson.Deserialize(Text, QiniuJson.SerializerContext.FluxInfo);
}
return info;
}
Expand Down
9 changes: 5 additions & 4 deletions src/Qiniu/CDN/LogListRequest.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System.Text;
using System.Collections.Generic;
using Newtonsoft.Json;
using System.Text.Json.Serialization;
using Qiniu.Util;
namespace Qiniu.CDN
{
/// <summary>
Expand All @@ -11,13 +12,13 @@ public class LogListRequest
/// <summary>
/// 日期,例如 2016-09-01
/// </summary>
[JsonProperty("day")]
[JsonPropertyName("day")]
public string Day { get; set; }

/// <summary>
/// 域名列表,以西文半角分号分割
/// </summary>
[JsonProperty("domains")]
[JsonPropertyName("domains")]
public string Domains { get; set; }

/// <summary>
Expand Down Expand Up @@ -88,7 +89,7 @@ public LogListRequest(string day, IList<string> domains)
/// <returns>请求内容的JSON字符串</returns>
public string ToJsonStr()
{
return JsonConvert.SerializeObject(this);
return QiniuJson.Serialize(this, QiniuJson.SerializerContext.LogListRequest);
}
}
}
8 changes: 4 additions & 4 deletions src/Qiniu/CDN/LogListResult.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using System.Text;
using Newtonsoft.Json;
using Qiniu.Http;
using Qiniu.Util;

namespace Qiniu.CDN
{
Expand All @@ -12,14 +12,14 @@ public class LogListResult : HttpResult
/// <summary>
/// 获取日志列表信息
/// </summary>
public LogListInfo Result
public LogListInfo? Result
{
get
{
LogListInfo info = null;
LogListInfo? info = null;
if ((Code == (int)HttpCode.OK) && (!string.IsNullOrEmpty(Text)))
{
info=JsonConvert.DeserializeObject<LogListInfo>(Text);
info = QiniuJson.Deserialize(Text, QiniuJson.SerializerContext.LogListInfo);
}
return info;
}
Expand Down
8 changes: 5 additions & 3 deletions src/Qiniu/CDN/PrefetchRequest.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json;
using System.Text.Json.Serialization;
using Qiniu.Util;

namespace Qiniu.CDN
{
Expand All @@ -16,7 +17,8 @@ public class PrefetchRequest
/// 请输入资源 url 完整的绝对路径,由 http:// 或 https:// 开始
/// 资源 url 不支持通配符,例如:不支持 http://www.test.com/abc/*.*
/// </summary>
[JsonProperty("urls",NullValueHandling=NullValueHandling.Ignore)]
[JsonPropertyName("urls")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public List<string> Urls { get; set; }

/// <summary>
Expand Down Expand Up @@ -67,7 +69,7 @@ public void AddUrls(IList<string> urls)
/// <returns>请求内容的JSON字符串</returns>
public string ToJsonStr()
{
return JsonConvert.SerializeObject(this);
return QiniuJson.Serialize(this, QiniuJson.SerializerContext.PrefetchRequest);
}
}
}
8 changes: 4 additions & 4 deletions src/Qiniu/CDN/PrefetchResult.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using System.Text;
using Newtonsoft.Json;
using Qiniu.Http;
using Qiniu.Util;

namespace Qiniu.CDN
{
Expand All @@ -12,14 +12,14 @@ public class PrefetchResult : HttpResult
/// <summary>
/// 获取文件预取信息
/// </summary>
public PrefetchInfo Result
public PrefetchInfo? Result
{
get
{
PrefetchInfo info = null;
PrefetchInfo? info = null;
if ((Code == (int)HttpCode.OK) && (!string.IsNullOrEmpty(Text)))
{
info=JsonConvert.DeserializeObject<PrefetchInfo>(Text);
info = QiniuJson.Deserialize(Text, QiniuJson.SerializerContext.PrefetchInfo);
}
return info;
}
Expand Down
11 changes: 7 additions & 4 deletions src/Qiniu/CDN/RefreshRequest.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json;
using System.Text.Json.Serialization;
using Qiniu.Util;
namespace Qiniu.CDN
{
/// <summary>
Expand All @@ -17,15 +18,17 @@ public class RefreshRequest
/// 带参数的 url 刷新,根据其域名缓存配置是否忽略参数缓存决定刷新结果。
/// 如果配置了时间戳防盗链的资源 url 提交时刷新需要去掉 e 和 token 参数
/// </summary>
[JsonProperty("urls", NullValueHandling = NullValueHandling.Ignore)]
[JsonPropertyName("urls")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public List<string> Urls { get; set; }

/// <summary>
/// 要刷新的目录url列表,总数不超过10条;目录dir,即表示一个目录级的url,需要以 / 结尾
/// 例如:http://bar.foo.com/dir/,
/// 也支持在尾部使用通配符,例如:http://bar.foo.com/dir/*
/// </summary>
[JsonProperty("dirs", NullValueHandling = NullValueHandling.Ignore)]
[JsonPropertyName("dirs")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public List<string> Dirs { get; set; }

/// <summary>
Expand Down Expand Up @@ -100,7 +103,7 @@ public void AddDirs(IList<string> dirs)
/// <returns>请求内容的JSON字符串</returns>
public string ToJsonStr()
{
return JsonConvert.SerializeObject(this);
return QiniuJson.Serialize(this, QiniuJson.SerializerContext.RefreshRequest);
}
}
}
8 changes: 4 additions & 4 deletions src/Qiniu/CDN/RefreshResult.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using System.Text;
using Newtonsoft.Json;
using Qiniu.Http;
using Qiniu.Util;

namespace Qiniu.CDN
{
Expand All @@ -12,14 +12,14 @@ public class RefreshResult : HttpResult
/// <summary>
/// 获取缓存刷新信息
/// </summary>
public RefreshInfo Result
public RefreshInfo? Result
{
get
{
RefreshInfo info = null;
RefreshInfo? info = null;
if ((Code == (int)HttpCode.OK) && (!string.IsNullOrEmpty(Text)))
{
info=JsonConvert.DeserializeObject<RefreshInfo>(Text);
info = QiniuJson.Deserialize(Text, QiniuJson.SerializerContext.RefreshInfo);
}
return info;
}
Expand Down
Loading