Skip to content

Commit 20e773f

Browse files
authored
Dev (#44)
* - use configureawait(false) - update .editorconfig to include future ca2007 diagnostics in src folder * - add WithCancellation and ConfigureAwait to all await foreach clause * - migrate to xunit.v3 - update deps - cleanup test code * - add benchmark results - bump version * - cleanup code
1 parent 04139d0 commit 20e773f

33 files changed

Lines changed: 442 additions & 194 deletions

.editorconfig

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,15 @@ csharp_style_prefer_primary_constructors = true:suggestion
164164
csharp_prefer_system_threading_lock = true:suggestion
165165
csharp_style_expression_bodied_lambdas = true:silent
166166
csharp_style_expression_bodied_local_functions = false:silent
167+
csharp_style_prefer_simple_property_accessors = true:suggestion
167168
###############################
168169
# VB Coding Conventions #
169170
###############################
170171
[*.vb]
171172
# Modifier preferences
172173
visual_basic_preferred_modifier_order = Partial,Default,Private,Protected,Public,Friend,NotOverridable,Overridable,MustOverride,Overloads,Overrides,MustInherit,NotInheritable,Static,Shared,Shadows,ReadOnly,WriteOnly,Dim,Const,WithEvents,Widening,Narrowing,Custom,Async:suggestion
174+
###########################################
175+
# Common Library Coding Conventions #
176+
###########################################
177+
[/src/**/*.{cs,vb}]
178+
dotnet_diagnostic.CA2007.severity = error

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@
1919
<PackageLicenseExpression>MIT</PackageLicenseExpression>
2020
<PackageRequireLicenseAcceptance>True</PackageRequireLicenseAcceptance>
2121

22-
<Version>2.0.2</Version>
22+
<Version>2.0.3</Version>
2323
</PropertyGroup>
2424
</Project>
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
 k6  .\k6 run minimal_api_basic.js
2+
3+
/\ Grafana /‾‾/
4+
/\ / \ |\ __ / /
5+
/ \/ \ | |/ / / ‾‾\
6+
/ \ | ( | (‾) |
7+
/ __________ \ |_|\_\ \_____/
8+
9+
execution: local
10+
script: minimal_api_basic.js
11+
output: -
12+
13+
scenarios: (100.00%) 1 scenario, 100 max VUs, 2m20s max duration (incl. graceful stop):
14+
* default: Up to 100 looping VUs for 1m50s over 3 stages (gracefulRampDown: 30s, gracefulStop: 30s)
15+
16+
17+
✓ status was 200
18+
19+
checks.........................: 100.00% 11392307 out of 11392307
20+
data_received..................: 1.9 GB 18 MB/s
21+
data_sent......................: 1.2 GB 11 MB/s
22+
http_req_blocked...............: avg=2.22µs min=0s med=0s max=27.83ms p(90)=0s p(95)=0s
23+
http_req_connecting............: avg=4ns min=0s med=0s max=1.99ms p(90)=0s p(95)=0s
24+
✓ http_req_duration..............: avg=672.9µs min=0s med=826.9µs max=48.65ms p(90)=1.34ms p(95)=1.57ms
25+
{ expected_response:true }...: avg=672.9µs min=0s med=826.9µs max=48.65ms p(90)=1.34ms p(95)=1.57ms
26+
http_req_failed................: 0.00% 0 out of 11392307
27+
http_req_receiving.............: avg=22.56µs min=0s med=0s max=38.49ms p(90)=0s p(95)=0s
28+
http_req_sending...............: avg=6.77µs min=0s med=0s max=45.29ms p(90)=0s p(95)=0s
29+
http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
30+
http_req_waiting...............: avg=643.56µs min=0s med=710µs max=48.65ms p(90)=1.26ms p(95)=1.53ms
31+
http_reqs......................: 11392307 103565.979209/s
32+
iteration_duration.............: avg=737.54µs min=0s med=998.1µs max=48.65ms p(90)=1.5ms p(95)=1.76ms
33+
iterations.....................: 11392307 103565.979209/s
34+
vus............................: 1 min=1 max=100
35+
vus_max........................: 100 min=100 max=100
36+
37+
38+
running (1m50.0s), 000/100 VUs, 11392307 complete and 0 interrupted iterations
39+
default ✓ [======================================] 000/100 VUs 1m50s
40+
41+
42+
 k6  .\k6 run minimal_endpoint_basic.js
43+
44+
/\ Grafana /‾‾/
45+
/\ / \ |\ __ / /
46+
/ \/ \ | |/ / / ‾‾\
47+
/ \ | ( | (‾) |
48+
/ __________ \ |_|\_\ \_____/
49+
50+
execution: local
51+
script: minimal_endpoint_basic.js
52+
output: -
53+
54+
scenarios: (100.00%) 1 scenario, 100 max VUs, 2m20s max duration (incl. graceful stop):
55+
* default: Up to 100 looping VUs for 1m50s over 3 stages (gracefulRampDown: 30s, gracefulStop: 30s)
56+
57+
58+
✓ status was 200
59+
60+
checks.........................: 100.00% 11474659 out of 11474659
61+
data_received..................: 2.0 GB 18 MB/s
62+
data_sent......................: 1.2 GB 11 MB/s
63+
http_req_blocked...............: avg=2.22µs min=0s med=0s max=24.08ms p(90)=0s p(95)=0s
64+
http_req_connecting............: avg=5ns min=0s med=0s max=1.56ms p(90)=0s p(95)=0s
65+
✓ http_req_duration..............: avg=667.12µs min=0s med=780.7µs max=54.12ms p(90)=1.31ms p(95)=1.55ms
66+
{ expected_response:true }...: avg=667.12µs min=0s med=780.7µs max=54.12ms p(90)=1.31ms p(95)=1.55ms
67+
http_req_failed................: 0.00% 0 out of 11474659
68+
http_req_receiving.............: avg=22.66µs min=0s med=0s max=52.09ms p(90)=0s p(95)=0s
69+
http_req_sending...............: avg=6.79µs min=0s med=0s max=35.72ms p(90)=0s p(95)=0s
70+
http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
71+
http_req_waiting...............: avg=637.66µs min=0s med=677µs max=50.56ms p(90)=1.23ms p(95)=1.52ms
72+
http_reqs......................: 11474659 104314.912164/s
73+
iteration_duration.............: avg=732.08µs min=0s med=997.6µs max=55.73ms p(90)=1.49ms p(95)=1.74ms
74+
iterations.....................: 11474659 104314.912164/s
75+
vus............................: 1 min=1 max=100
76+
vus_max........................: 100 min=100 max=100
77+
78+
79+
running (1m50.0s), 000/100 VUs, 11474659 complete and 0 interrupted iterations
80+
default ✓ [======================================] 000/100 VUs 1m50s
81+
82+
83+
 k6  .\k6 run webresult_endpoint_basic.js
84+
85+
/\ Grafana /‾‾/
86+
/\ / \ |\ __ / /
87+
/ \/ \ | |/ / / ‾‾\
88+
/ \ | ( | (‾) |
89+
/ __________ \ |_|\_\ \_____/
90+
91+
execution: local
92+
script: webresult_endpoint_basic.js
93+
output: -
94+
95+
scenarios: (100.00%) 1 scenario, 100 max VUs, 2m20s max duration (incl. graceful stop):
96+
* default: Up to 100 looping VUs for 1m50s over 3 stages (gracefulRampDown: 30s, gracefulStop: 30s)
97+
98+
99+
✓ status was 200
100+
101+
checks.........................: 100.00% 11453194 out of 11453194
102+
data_received..................: 2.0 GB 18 MB/s
103+
data_sent......................: 1.2 GB 11 MB/s
104+
http_req_blocked...............: avg=2.2µs min=0s med=0s max=22.9ms p(90)=0s p(95)=0s
105+
http_req_connecting............: avg=5ns min=0s med=0s max=2.06ms p(90)=0s p(95)=0s
106+
✓ http_req_duration..............: avg=657.67µs min=0s med=695µs max=40.25ms p(90)=1.31ms p(95)=1.6ms
107+
{ expected_response:true }...: avg=657.67µs min=0s med=695µs max=40.25ms p(90)=1.31ms p(95)=1.6ms
108+
http_req_failed................: 0.00% 0 out of 11453194
109+
http_req_receiving.............: avg=22.42µs min=0s med=0s max=37.78ms p(90)=0s p(95)=0s
110+
http_req_sending...............: avg=6.75µs min=0s med=0s max=28.71ms p(90)=0s p(95)=0s
111+
http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
112+
http_req_waiting...............: avg=628.49µs min=0s med=602.4µs max=38.65ms p(90)=1.23ms p(95)=1.55ms
113+
http_reqs......................: 11453194 104119.885444/s
114+
iteration_duration.............: avg=729.85µs min=0s med=931.4µs max=40.25ms p(90)=1.5ms p(95)=1.85ms
115+
iterations.....................: 11453194 104119.885444/s
116+
vus............................: 1 min=1 max=100
117+
vus_max........................: 100 min=100 max=100
118+
119+
120+
running (1m50.0s), 000/100 VUs, 11453194 complete and 0 interrupted iterations
121+
default ✓ [======================================] 000/100 VUs 1m50s
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
 k6  .\k6 run minimal_api_inprocess.js
2+
3+
/\ Grafana /‾‾/
4+
/\ / \ |\ __ / /
5+
/ \/ \ | |/ / / ‾‾\
6+
/ \ | ( | (‾) |
7+
/ __________ \ |_|\_\ \_____/
8+
9+
execution: local
10+
script: minimal_api_inprocess.js
11+
output: -
12+
13+
scenarios: (100.00%) 1 scenario, 100 max VUs, 2m20s max duration (incl. graceful stop):
14+
* default: Up to 100 looping VUs for 1m50s over 3 stages (gracefulRampDown: 30s, gracefulStop: 30s)
15+
16+
17+
✓ status was 200
18+
19+
checks.........................: 100.00% 8326756 out of 8326756
20+
data_received..................: 1.6 GB 14 MB/s
21+
data_sent......................: 2.0 GB 18 MB/s
22+
http_req_blocked...............: avg=2.77µs min=0s med=0s max=26.97ms p(90)=0s p(95)=0s
23+
http_req_connecting............: avg=8ns min=0s med=0s max=1.99ms p(90)=0s p(95)=0s
24+
✓ http_req_duration..............: avg=905.1µs min=0s med=999.6µs max=55.75ms p(90)=1.8ms p(95)=2ms
25+
{ expected_response:true }...: avg=905.1µs min=0s med=999.6µs max=55.75ms p(90)=1.8ms p(95)=2ms
26+
http_req_failed................: 0.00% 0 out of 8326756
27+
http_req_receiving.............: avg=27.74µs min=0s med=0s max=53.6ms p(90)=0s p(95)=0s
28+
http_req_sending...............: avg=11.09µs min=0s med=0s max=33.77ms p(90)=0s p(95)=0s
29+
http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
30+
http_req_waiting...............: avg=866.25µs min=0s med=999.4µs max=54.22ms p(90)=1.69ms p(95)=2ms
31+
http_reqs......................: 8326756 75697.467398/s
32+
iteration_duration.............: avg=1ms min=0s med=1ms max=55.75ms p(90)=1.99ms p(95)=2.02ms
33+
iterations.....................: 8326756 75697.467398/s
34+
vus............................: 1 min=1 max=100
35+
vus_max........................: 100 min=100 max=100
36+
37+
38+
running (1m50.0s), 000/100 VUs, 8326756 complete and 0 interrupted iterations
39+
default ✓ [======================================] 000/100 VUs 1m50s
40+
41+
42+
 k6  .\k6 run minimal_endpoint_inprocess.js
43+
44+
/\ Grafana /‾‾/
45+
/\ / \ |\ __ / /
46+
/ \/ \ | |/ / / ‾‾\
47+
/ \ | ( | (‾) |
48+
/ __________ \ |_|\_\ \_____/
49+
50+
execution: local
51+
script: minimal_endpoint_inprocess.js
52+
output: -
53+
54+
scenarios: (100.00%) 1 scenario, 100 max VUs, 2m20s max duration (incl. graceful stop):
55+
* default: Up to 100 looping VUs for 1m50s over 3 stages (gracefulRampDown: 30s, gracefulStop: 30s)
56+
57+
58+
✓ status was 200
59+
60+
checks.........................: 100.00% 8259744 out of 8259744
61+
data_received..................: 1.5 GB 14 MB/s
62+
data_sent......................: 2.0 GB 19 MB/s
63+
http_req_blocked...............: avg=2.74µs min=0s med=0s max=20.41ms p(90)=0s p(95)=0s
64+
http_req_connecting............: avg=9ns min=0s med=0s max=8.2ms p(90)=0s p(95)=0s
65+
✓ http_req_duration..............: avg=912.06µs min=0s med=999.6µs max=51.58ms p(90)=1.78ms p(95)=2ms
66+
{ expected_response:true }...: avg=912.06µs min=0s med=999.6µs max=51.58ms p(90)=1.78ms p(95)=2ms
67+
http_req_failed................: 0.00% 0 out of 8259744
68+
http_req_receiving.............: avg=28.53µs min=0s med=0s max=36.39ms p(90)=0s p(95)=0s
69+
http_req_sending...............: avg=11.31µs min=0s med=0s max=35.28ms p(90)=0s p(95)=0s
70+
http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
71+
http_req_waiting...............: avg=872.21µs min=0s med=999.3µs max=49.89ms p(90)=1.69ms p(95)=2ms
72+
http_reqs......................: 8259744 75088.531441/s
73+
iteration_duration.............: avg=1.01ms min=0s med=1ms max=68.37ms p(90)=1.99ms p(95)=2.04ms
74+
iterations.....................: 8259744 75088.531441/s
75+
vus............................: 1 min=1 max=100
76+
vus_max........................: 100 min=100 max=100
77+
78+
79+
running (1m50.0s), 000/100 VUs, 8259744 complete and 0 interrupted iterations
80+
default ✓ [======================================] 000/100 VUs 1m50s
81+
82+
83+
 k6  .\k6 run webresult_endpoint_inprocess.js
84+
85+
/\ Grafana /‾‾/
86+
/\ / \ |\ __ / /
87+
/ \/ \ | |/ / / ‾‾\
88+
/ \ | ( | (‾) |
89+
/ __________ \ |_|\_\ \_____/
90+
91+
execution: local
92+
script: webresult_endpoint_inprocess.js
93+
output: -
94+
95+
scenarios: (100.00%) 1 scenario, 100 max VUs, 2m20s max duration (incl. graceful stop):
96+
* default: Up to 100 looping VUs for 1m50s over 3 stages (gracefulRampDown: 30s, gracefulStop: 30s)
97+
98+
99+
✓ status was 200
100+
101+
checks.........................: 100.00% 8320628 out of 8320628
102+
data_received..................: 1.6 GB 14 MB/s
103+
data_sent......................: 2.1 GB 19 MB/s
104+
http_req_blocked...............: avg=2.78µs min=0s med=0s max=22.09ms p(90)=0s p(95)=0s
105+
http_req_connecting............: avg=7ns min=0s med=0s max=1.93ms p(90)=0s p(95)=0s
106+
✓ http_req_duration..............: avg=897.17µs min=0s med=999.6µs max=87.26ms p(90)=1.82ms p(95)=2.01ms
107+
{ expected_response:true }...: avg=897.17µs min=0s med=999.6µs max=87.26ms p(90)=1.82ms p(95)=2.01ms
108+
http_req_failed................: 0.00% 0 out of 8320628
109+
http_req_receiving.............: avg=28.25µs min=0s med=0s max=75.84ms p(90)=0s p(95)=0s
110+
http_req_sending...............: avg=11.18µs min=0s med=0s max=64.19ms p(90)=0s p(95)=0s
111+
http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
112+
http_req_waiting...............: avg=857.73µs min=0s med=999.3µs max=87.26ms p(90)=1.71ms p(95)=2ms
113+
http_reqs......................: 8320628 75641.819533/s
114+
iteration_duration.............: avg=1ms min=0s med=1ms max=87.26ms p(90)=1.99ms p(95)=2.05ms
115+
iterations.....................: 8320628 75641.819533/s
116+
vus............................: 1 min=1 max=100
117+
vus_max........................: 100 min=100 max=100
118+
119+
120+
running (1m50.0s), 000/100 VUs, 8320628 complete and 0 interrupted iterations
121+
default ✓ [======================================] 000/100 VUs 1m50s

samples/ShowcaseWebApi/ShowcaseWebApi.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<ItemGroup>
88
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="10.0.2" />
9-
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.1.0" />
9+
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.1.1" />
1010
<PackageReference Include="FluentValidation.DependencyInjectionExtensions" Version="12.1.1" />
1111
<PackageReference Include="Asp.Versioning.Http" Version="8.1.1" />
1212
<PackageReference Include="Asp.Versioning.Mvc.ApiExplorer" Version="8.1.1" />

samples/WeatherForecastWebApi/WeatherForecastWebApi.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
<ItemGroup>
1010
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.0.2" />
11-
<PackageReference Include="Scalar.AspNetCore" Version="2.12.20" />
11+
<PackageReference Include="Scalar.AspNetCore" Version="2.12.32" />
1212
</ItemGroup>
1313

1414
<ItemGroup>

src/ModEndpoints.Core/[Endpoints]/BaseBusinessResultEndpoint.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@ as BaseBusinessResultEndpoint<TRequest, TResponse>
2828
//Request validation
2929
{
3030
var validationController = context.RequestServices.GetRequiredService<IRequestValidationController>();
31-
var validationResult = await validationController.ValidateAsync(req, context, ct);
31+
var validationResult = await validationController.ValidateAsync(req, context, ct).ConfigureAwait(false);
3232
if (validationResult?.IsFailed == true)
3333
{
34-
return await HandleInvalidValidationResultAsync(validationResult, context, ct);
34+
return await HandleInvalidValidationResultAsync(validationResult, context, ct).ConfigureAwait(false);
3535
}
3636
}
3737
//Handler
38-
return await handler.HandleAsync(req, ct);
38+
return await handler.HandleAsync(req, ct).ConfigureAwait(false);
3939
}
4040

4141
/// <summary>
@@ -81,7 +81,7 @@ as BaseBusinessResultEndpoint<TResponse>
8181
var ct = context.RequestAborted;
8282

8383
//Handler
84-
return await handler.HandleAsync(ct);
84+
return await handler.HandleAsync(ct).ConfigureAwait(false);
8585
}
8686

8787
/// <summary>

src/ModEndpoints.Core/[Endpoints]/BaseServiceEndpoint.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@ as BaseServiceEndpoint<TRequest, TResponse>
3030
//Request validation
3131
{
3232
var validationController = context.RequestServices.GetRequiredService<IRequestValidationController>();
33-
var validationResult = await validationController.ValidateAsync(req, context, ct);
33+
var validationResult = await validationController.ValidateAsync(req, context, ct).ConfigureAwait(false);
3434
if (validationResult?.IsFailed == true)
3535
{
36-
return await HandleInvalidValidationResultAsync(validationResult, context, ct);
36+
return await HandleInvalidValidationResultAsync(validationResult, context, ct).ConfigureAwait(false);
3737
}
3838
}
3939
//Handler
40-
return await handler.HandleAsync(req, ct);
40+
return await handler.HandleAsync(req, ct).ConfigureAwait(false);
4141
}
4242

4343
/// <summary>

src/ModEndpoints.Core/[Endpoints]/BaseServiceEndpointWithStreamingResponse.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,15 @@ as BaseServiceEndpointWithStreamingResponse<TRequest, TResponse>
3030
//Request validation
3131
{
3232
var validationController = context.RequestServices.GetRequiredService<IRequestValidationController>();
33-
var validationResult = await validationController.ValidateAsync(req, context, ct);
33+
var validationResult = await validationController.ValidateAsync(req, context, ct).ConfigureAwait(false);
3434
if (validationResult?.IsFailed == true)
3535
{
36-
yield return await HandleInvalidValidationResultAsync(validationResult, context, ct);
36+
yield return await HandleInvalidValidationResultAsync(validationResult, context, ct).ConfigureAwait(false);
3737
yield break;
3838
}
3939
}
4040
//Handler
41-
await foreach (var item in handler.HandleAsync(req, ct).WithCancellation(ct))
41+
await foreach (var item in handler.HandleAsync(req, ct).WithCancellation(ct).ConfigureAwait(false))
4242
{
4343
yield return item;
4444
}

src/ModEndpoints.Core/[Endpoints]/BaseWebResultEndpoint.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,16 @@ as BaseWebResultEndpoint<TRequest, THandlerResult>
2828
//Request validation
2929
{
3030
var validationController = context.RequestServices.GetRequiredService<IRequestValidationController>();
31-
var validationResult = await validationController.ValidateAsync(req, context, ct);
31+
var validationResult = await validationController.ValidateAsync(req, context, ct).ConfigureAwait(false);
3232
if (validationResult?.IsFailed == true)
3333
{
34-
return await HandleInvalidValidationResultAsync(validationResult, context, ct);
34+
return await HandleInvalidValidationResultAsync(validationResult, context, ct).ConfigureAwait(false);
3535
}
3636
}
3737
//Handler
38-
var result = await handler.HandleAsync(req, ct);
38+
var result = await handler.HandleAsync(req, ct).ConfigureAwait(false);
3939
//Post handler mapping
40-
return await handler.ConvertResultToResponseAsync(result, context, ct);
40+
return await handler.ConvertResultToResponseAsync(result, context, ct).ConfigureAwait(false);
4141
}
4242

4343
/// <summary>
@@ -98,9 +98,9 @@ as BaseWebResultEndpoint<THandlerResult>
9898
var ct = context.RequestAborted;
9999

100100
//Handler
101-
var result = await handler.HandleAsync(ct);
101+
var result = await handler.HandleAsync(ct).ConfigureAwait(false);
102102
//Post handler mapping
103-
return await handler.ConvertResultToResponseAsync(result, context, ct);
103+
return await handler.ConvertResultToResponseAsync(result, context, ct).ConfigureAwait(false);
104104
}
105105

106106
/// <summary>

0 commit comments

Comments
 (0)