Skip to content

Commit e7f1a8c

Browse files
committed
合并develop
2 parents 99d3277 + f704560 commit e7f1a8c

File tree

6 files changed

+171
-35
lines changed

6 files changed

+171
-35
lines changed

App/User.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.ComponentModel.DataAnnotations;
33
using System.Text.Json.Serialization;
4+
using WebApiClientCore.Serialization.JsonConverters;
45

56
namespace App
67
{
@@ -19,6 +20,7 @@ public class User
1920

2021
public string NickName { get; set; }
2122

23+
[JsonDateTime("yyyy年MM月dd日")]
2224
public DateTime? BirthDay { get; set; }
2325

2426
public Gender Gender { get; set; }

WebApiClientCore/Attributes/ActionAttributes/BasicAuthAttribute.cs

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Diagnostics;
33
using System.Net.Http.Headers;
4-
using System.Text;
54
using System.Threading.Tasks;
65

76
namespace WebApiClientCore.Attributes
@@ -13,26 +12,19 @@ namespace WebApiClientCore.Attributes
1312
public class BasicAuthAttribute : ApiActionAttribute
1413
{
1514
/// <summary>
16-
/// 参数
15+
/// 授权头的值
1716
/// </summary>
18-
private readonly string parameter;
17+
private readonly BasicAuthenticationHeaderValue authorization;
1918

2019
/// <summary>
2120
/// 基本授权
2221
/// </summary>
23-
/// <param name="userName">账号</param>
22+
/// <param name="username">账号</param>
2423
/// <param name="password">密码</param>
2524
/// <exception cref="ArgumentNullException"></exception>
26-
public BasicAuthAttribute(string userName, string? password)
25+
public BasicAuthAttribute(string username, string? password)
2726
{
28-
if (string.IsNullOrEmpty(userName))
29-
{
30-
throw new ArgumentNullException(userName);
31-
}
32-
33-
var value = $"{userName}:{password}";
34-
var bytes = Encoding.ASCII.GetBytes(value);
35-
this.parameter = Convert.ToBase64String(bytes);
27+
this.authorization = new BasicAuthenticationHeaderValue(username, password);
3628
}
3729

3830
/// <summary>
@@ -42,7 +34,7 @@ public BasicAuthAttribute(string userName, string? password)
4234
/// <returns></returns>
4335
public override Task OnRequestAsync(ApiRequestContext context)
4436
{
45-
context.HttpContext.RequestMessage.Headers.Authorization = new AuthenticationHeaderValue("Basic", this.parameter);
37+
context.HttpContext.RequestMessage.Headers.Authorization = authorization;
4638
return Task.CompletedTask;
4739
}
4840
}

WebApiClientCore/Serialization/JsonConverters/JsonDateTimeAttribute.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,12 @@ public JsonDateTimeAttribute(string dateTimeFormat)
3131
/// <returns></returns>
3232
public override JsonConverter CreateConverter(Type typeToConvert)
3333
{
34-
return new JsonDateTimeConverter(this.dateTimeFormat);
34+
var converter = new JsonDateTimeConverter(this.dateTimeFormat);
35+
if (converter.CanConvert(typeToConvert) == false)
36+
{
37+
throw new NotSupportedException($"JsonDateTimeAttribute不支持转换{typeToConvert}");
38+
}
39+
return converter;
3540
}
3641
}
3742
}

WebApiClientCore/Serialization/JsonConverters/JsonDateTimeConverter.cs

Lines changed: 95 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,7 @@ namespace WebApiClientCore.Serialization.JsonConverters
1010
/// 支持DateTime和DateTimeOffset
1111
/// </summary>
1212
public class JsonDateTimeConverter : JsonConverterFactory
13-
{
14-
/// <summary>
15-
/// 获取ISO8601格式的实例
16-
/// </summary>
17-
public static JsonDateTimeConverter Default { get; } = new JsonDateTimeConverter("O");
18-
19-
/// <summary>
20-
/// 获取本设备的时间格式的实例
21-
/// </summary>
22-
public static JsonDateTimeConverter LocalMachine { get; } = new JsonDateTimeConverter($"{DateTimeFormatInfo.CurrentInfo.ShortDatePattern} {DateTimeFormatInfo.CurrentInfo.LongTimePattern}");
23-
24-
13+
{
2514
/// <summary>
2615
/// 获取日期时间格式
2716
/// </summary>
@@ -44,7 +33,12 @@ public JsonDateTimeConverter(string dateTimeFormat)
4433
/// <returns></returns>
4534
public override bool CanConvert(Type typeToConvert)
4635
{
47-
return typeToConvert == typeof(DateTime) || typeToConvert == typeof(DateTimeOffset);
36+
// .net5以前,JsonConverterAttribute不支持处理有值的可空类型属性
37+
// 所以需要编写可空类型日期时间的转换器
38+
return typeToConvert == typeof(DateTime) ||
39+
typeToConvert == typeof(DateTime?) ||
40+
typeToConvert == typeof(DateTimeOffset) ||
41+
typeToConvert == typeof(DateTimeOffset?);
4842
}
4943

5044
/// <summary>
@@ -59,10 +53,18 @@ public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializer
5953
{
6054
return new DateTimeConverter(this.DateTimeFormat);
6155
}
62-
else
56+
57+
if (typeToConvert == typeof(DateTime?))
58+
{
59+
return new NullableDateTimeConverter(this.DateTimeFormat);
60+
}
61+
62+
if (typeToConvert == typeof(DateTimeOffset))
6363
{
6464
return new DateTimeOffsetConverter(this.DateTimeFormat);
6565
}
66+
67+
return new NullableDateTimeOffsetConverter(this.DateTimeFormat);
6668
}
6769

6870
/// <summary>
@@ -79,11 +81,11 @@ public DateTimeConverter(string format)
7981

8082
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
8183
{
82-
if (reader.TokenType == JsonTokenType.String)
84+
if (reader.TryGetDateTime(out var value))
8385
{
84-
return DateTime.Parse(reader.GetString());
86+
return value;
8587
}
86-
return reader.GetDateTime();
88+
return DateTime.Parse(reader.GetString());
8789
}
8890

8991
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
@@ -93,6 +95,43 @@ public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializer
9395
}
9496
}
9597

98+
99+
/// <summary>
100+
/// DateTime?转换器
101+
/// </summary>
102+
private class NullableDateTimeConverter : JsonConverter<DateTime?>
103+
{
104+
private readonly string format;
105+
106+
public NullableDateTimeConverter(string format)
107+
{
108+
this.format = format;
109+
}
110+
111+
public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
112+
{
113+
if (reader.TryGetDateTime(out var value))
114+
{
115+
return value;
116+
}
117+
118+
return DateTime.Parse(reader.GetString());
119+
}
120+
121+
public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options)
122+
{
123+
if (value == null)
124+
{
125+
writer.WriteNullValue();
126+
}
127+
else
128+
{
129+
var dateTimeString = value.Value.ToString(this.format, CultureInfo.InvariantCulture);
130+
writer.WriteStringValue(dateTimeString);
131+
}
132+
}
133+
}
134+
96135
/// <summary>
97136
/// DateTimeOffset转换器
98137
/// </summary>
@@ -107,11 +146,11 @@ public DateTimeOffsetConverter(string format)
107146

108147
public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
109148
{
110-
if (reader.TokenType == JsonTokenType.String)
149+
if (reader.TryGetDateTimeOffset(out var value))
111150
{
112-
return DateTimeOffset.Parse(reader.GetString());
151+
return value;
113152
}
114-
return reader.GetDateTimeOffset();
153+
return DateTimeOffset.Parse(reader.GetString());
115154
}
116155

117156
public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options)
@@ -120,5 +159,41 @@ public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSeri
120159
writer.WriteStringValue(dateTimeString);
121160
}
122161
}
162+
163+
164+
/// <summary>
165+
/// DateTimeOffset?转换器
166+
/// </summary>
167+
private class NullableDateTimeOffsetConverter : JsonConverter<DateTimeOffset?>
168+
{
169+
private readonly string format;
170+
171+
public NullableDateTimeOffsetConverter(string format)
172+
{
173+
this.format = format;
174+
}
175+
176+
public override DateTimeOffset? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
177+
{
178+
if (reader.TryGetDateTimeOffset(out var value))
179+
{
180+
return value;
181+
}
182+
return DateTimeOffset.Parse(reader.GetString());
183+
}
184+
185+
public override void Write(Utf8JsonWriter writer, DateTimeOffset? value, JsonSerializerOptions options)
186+
{
187+
if (value == null)
188+
{
189+
writer.WriteNullValue();
190+
}
191+
else
192+
{
193+
var dateTimeString = value.Value.ToString(this.format, CultureInfo.InvariantCulture);
194+
writer.WriteStringValue(dateTimeString);
195+
}
196+
}
197+
}
123198
}
124199
}

WebApiClientCore/Serialization/JsonConverters/JsonLocalDateTimeConverter.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Globalization;
23

34
namespace WebApiClientCore.Serialization.JsonConverters
45
{
@@ -8,6 +9,17 @@ namespace WebApiClientCore.Serialization.JsonConverters
89
[Obsolete("请使用JsonDateTimeConverter替代")]
910
public class JsonLocalDateTimeConverter : JsonDateTimeConverter
1011
{
12+
/// <summary>
13+
/// 获取ISO8601格式的实例
14+
/// </summary>
15+
public static JsonLocalDateTimeConverter Default { get; } = new JsonLocalDateTimeConverter();
16+
17+
/// <summary>
18+
/// 获取本设备的时间格式的实例
19+
/// </summary>
20+
public static JsonLocalDateTimeConverter LocalMachine { get; } = new JsonLocalDateTimeConverter($"{DateTimeFormatInfo.CurrentInfo.ShortDatePattern} {DateTimeFormatInfo.CurrentInfo.LongTimePattern}");
21+
22+
1123
/// <summary>
1224
/// DateTime和DateTimeOffset的Json转换器
1325
/// </summary>
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
using System.Text;
2+
3+
namespace System.Net.Http.Headers
4+
{
5+
/// <summary>
6+
/// 表示Basic体系的授权头值
7+
/// </summary>
8+
public class BasicAuthenticationHeaderValue : AuthenticationHeaderValue
9+
{
10+
/// <summary>
11+
/// 获取账号
12+
/// </summary>
13+
public string Username { get; }
14+
15+
/// <summary>
16+
/// 获取密码
17+
/// </summary>
18+
public string? Password { get; }
19+
20+
/// <summary>
21+
/// Basic体系的授权头值
22+
/// </summary>
23+
/// <param name="username">账号</param>
24+
/// <param name="password">密码</param>
25+
public BasicAuthenticationHeaderValue(string username, string? password)
26+
: base("Basic", GetParameter(username, password))
27+
{
28+
this.Username = username;
29+
this.Password = password;
30+
}
31+
32+
/// <summary>
33+
/// 获取参数
34+
/// </summary>
35+
/// <param name="username">账号</param>
36+
/// <param name="password">密码</param>
37+
/// <returns></returns>
38+
private static string GetParameter(string username, string? password)
39+
{
40+
if (string.IsNullOrEmpty(username))
41+
{
42+
throw new ArgumentNullException(username);
43+
}
44+
45+
var value = $"{username}:{password}";
46+
var bytes = Encoding.ASCII.GetBytes(value);
47+
return Convert.ToBase64String(bytes);
48+
}
49+
}
50+
}

0 commit comments

Comments
 (0)