Skip to content

Commit 0f2705a

Browse files
committed
add xml
1 parent 359aee3 commit 0f2705a

14 files changed

+116
-27
lines changed

WebApiClientCore.Benchmarks/Others/ReadAsJsonBenchamrk.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,21 @@ public class ReadAsJsonBenchmark
1414
[Benchmark(Baseline = true)]
1515
public async Task<User[]> ReadAsJsonAsync()
1616
{
17-
var content = new StreamContent(new MemoryStream(User.Utf8Array, writable: false));
17+
var content = new StreamContent(new MemoryStream(User.Utf8Json, writable: false));
1818
return await content.ReadAsJsonAsync<User[]>(null, default);
1919
}
2020

2121
[Benchmark]
2222
public async Task<User[]> ReadFromJsonAsync()
2323
{
24-
var content = new StreamContent(new MemoryStream(User.Utf8Array, writable: false));
24+
var content = new StreamContent(new MemoryStream(User.Utf8Json, writable: false));
2525
return await content.ReadFromJsonAsync<User[]>(default(JsonSerializerOptions));
2626
}
2727

2828
[Benchmark]
2929
public async Task<User[]> ReadAsByteArrayAsync()
3030
{
31-
var content = new StreamContent(new MemoryStream(User.Utf8Array, writable: false));
31+
var content = new StreamContent(new MemoryStream(User.Utf8Json, writable: false));
3232
var utf8Json = await content.ReadAsUtf8ByteArrayAsync();
3333
return JsonSerializer.Deserialize<User[]>(utf8Json, default(JsonSerializerOptions));
3434
}

WebApiClientCore.Benchmarks/Program.cs

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ static void Main(string[] args)
1010
{
1111
BenchmarkRunner.Run<HttpGetBenchmark>();
1212
BenchmarkRunner.Run<HttpGetJsonBenchmark>();
13+
BenchmarkRunner.Run<HttpPostXmlBenchmark>();
1314
BenchmarkRunner.Run<HttpPostJsonBenchmark>();
1415
BenchmarkRunner.Run<HttpPutFormBenchmark>();
1516
Console.ReadLine();

WebApiClientCore.Benchmarks/Requests/Benchmark.cs

+41-8
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Net;
77
using System.Net.Http;
88
using System.Net.Http.Headers;
9+
using System.Text;
910
using System.Threading;
1011
using System.Threading.Tasks;
1112

@@ -22,32 +23,49 @@ public void GlobalSetup()
2223
{
2324
var services = new ServiceCollection();
2425
services
25-
.AddHttpApi<IWebApiClientCoreApi>(o =>
26+
.AddHttpApi<IWebApiClientCoreJsonApi>(o =>
2627
{
2728
o.UseParameterPropertyValidate = false;
2829
o.UseReturnValuePropertyValidate = false;
2930
})
30-
.AddHttpMessageHandler(() => new UserResponseHandler())
31+
.AddHttpMessageHandler(() => new JsonResponseHandler())
3132
.ConfigureHttpClient(c => c.BaseAddress = new Uri("http://webapiclient.com/"));
3233

3334
services
34-
.AddRefitClient<IRefitApi>(new RefitSettings
35+
.AddHttpApi<IWebApiClientCoreXmlApi>(o =>
3536
{
37+
o.UseParameterPropertyValidate = false;
38+
o.UseReturnValuePropertyValidate = false;
39+
})
40+
.AddHttpMessageHandler(() => new XmlResponseHandler())
41+
.ConfigureHttpClient(c => c.BaseAddress = new Uri("http://webapiclient.com/"));
42+
43+
services
44+
.AddRefitClient<IRefitJsonApi>(new RefitSettings
45+
{
46+
})
47+
.AddHttpMessageHandler(() => new JsonResponseHandler())
48+
.ConfigureHttpClient(c => c.BaseAddress = new Uri("http://webapiclient.com/"));
49+
50+
services
51+
.AddRefitClient<IRefitXmlApi>(new RefitSettings
52+
{
53+
ContentSerializer = new XmlContentSerializer()
3654
})
37-
.AddHttpMessageHandler(() => new UserResponseHandler())
55+
.AddHttpMessageHandler(() => new XmlResponseHandler())
3856
.ConfigureHttpClient(c => c.BaseAddress = new Uri("http://webapiclient.com/"));
3957

4058
this.ServiceProvider = services.BuildServiceProvider();
41-
this.ServiceProvider.GetService<IWebApiClientCoreApi>();
42-
this.ServiceProvider.GetService<IRefitApi>();
59+
this.ServiceProvider.GetService<IWebApiClientCoreJsonApi>();
60+
this.ServiceProvider.GetService<IRefitJsonApi>();
4361
}
4462

45-
private class UserResponseHandler : DelegatingHandler
63+
private class JsonResponseHandler : DelegatingHandler
4664
{
4765
private static readonly MediaTypeHeaderValue applicationJson = MediaTypeHeaderValue.Parse("application/json");
4866
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
4967
{
50-
var content = new StreamContent(new MemoryStream(User.Utf8Array, writable: false), User.Utf8Array.Length);
68+
var content = new StreamContent(new MemoryStream(User.Utf8Json, writable: false), User.Utf8Json.Length);
5169
content.Headers.ContentType = applicationJson;
5270
var response = new HttpResponseMessage(HttpStatusCode.OK)
5371
{
@@ -56,5 +74,20 @@ protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage reques
5674
return Task.FromResult(response);
5775
}
5876
}
77+
78+
private class XmlResponseHandler : DelegatingHandler
79+
{
80+
private static readonly MediaTypeHeaderValue applicationXml = MediaTypeHeaderValue.Parse("application/xml");
81+
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
82+
{
83+
var content = new StringContent(User.XmlString, Encoding.UTF8);
84+
content.Headers.ContentType = applicationXml;
85+
var response = new HttpResponseMessage(HttpStatusCode.OK)
86+
{
87+
Content = content
88+
};
89+
return Task.FromResult(response);
90+
}
91+
}
5992
}
6093
}

WebApiClientCore.Benchmarks/Requests/HttpGetBenchmark.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ public class HttpGetBenchmark : Benchmark
1010
public async Task WebApiClientCore_GetAsync()
1111
{
1212
using var scope = this.ServiceProvider.CreateScope();
13-
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IWebApiClientCoreApi>();
13+
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IWebApiClientCoreJsonApi>();
1414
await benchmarkApi.GetAsync(id: "id001");
1515
}
1616

1717
[Benchmark]
1818
public async Task Refit_GetAsync()
1919
{
2020
using var scope = this.ServiceProvider.CreateScope();
21-
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IRefitApi>();
21+
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IRefitJsonApi>();
2222
await benchmarkApi.GetAsync(id: "id001");
2323
}
2424
}

WebApiClientCore.Benchmarks/Requests/HttpGetJsonBenchmark.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ public class HttpGetJsonBenchmark : Benchmark
1010
public async Task<User> WebApiClientCore_GetJsonAsync()
1111
{
1212
using var scope = this.ServiceProvider.CreateScope();
13-
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IWebApiClientCoreApi>();
13+
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IWebApiClientCoreJsonApi>();
1414
return await benchmarkApi.GetJsonAsync(id: "id001");
1515
}
1616

1717
[Benchmark]
1818
public async Task<User> Refit_GetJsonAsync()
1919
{
2020
using var scope = this.ServiceProvider.CreateScope();
21-
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IRefitApi>();
21+
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IRefitJsonApi>();
2222
return await benchmarkApi.GetJsonAsync(id: "id001");
2323
}
2424
}

WebApiClientCore.Benchmarks/Requests/HttpPostJsonBenchmark.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public class HttpPostJsonBenchmark : Benchmark
1010
public async Task<User> WebApiClientCore_PostJsonAsync()
1111
{
1212
using var scope = this.ServiceProvider.CreateScope();
13-
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IWebApiClientCoreApi>();
13+
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IWebApiClientCoreJsonApi>();
1414
return await benchmarkApi.PostJsonAsync(User.Instance);
1515
}
1616

@@ -19,7 +19,7 @@ public async Task<User> WebApiClientCore_PostJsonAsync()
1919
public async Task<User> Refit_PostJsonAsync()
2020
{
2121
using var scope = this.ServiceProvider.CreateScope();
22-
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IRefitApi>();
22+
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IRefitJsonApi>();
2323
return await benchmarkApi.PostJsonAsync(User.Instance);
2424
}
2525
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using BenchmarkDotNet.Attributes;
2+
using Microsoft.Extensions.DependencyInjection;
3+
using System.Threading.Tasks;
4+
5+
namespace WebApiClientCore.Benchmarks.Requests
6+
{
7+
public class HttpPostXmlBenchmark : Benchmark
8+
{
9+
[Benchmark(Baseline = true)]
10+
public async Task<User> WebApiClientCore_PostXmlAsync()
11+
{
12+
using var scope = this.ServiceProvider.CreateScope();
13+
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IWebApiClientCoreXmlApi>();
14+
return await benchmarkApi.PostXmlAsync(User.Instance);
15+
}
16+
17+
18+
[Benchmark]
19+
public async Task<User> Refit_PostXmlAsync()
20+
{
21+
using var scope = this.ServiceProvider.CreateScope();
22+
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IRefitXmlApi>();
23+
return await benchmarkApi.PostXmlAsync(User.Instance);
24+
}
25+
}
26+
}

WebApiClientCore.Benchmarks/Requests/HttpPutFormBenchmark.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ public class HttpPutFormBenchmark : Benchmark
1010
public async Task<User> WebApiClientCore_PutFormAsync()
1111
{
1212
using var scope = this.ServiceProvider.CreateScope();
13-
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IWebApiClientCoreApi>();
13+
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IWebApiClientCoreJsonApi>();
1414
return await benchmarkApi.PutFormAsync(id: "id001", User.Instance);
1515
}
1616

1717
[Benchmark]
1818
public async Task<User> Refit_PutFormAsync()
1919
{
2020
using var scope = this.ServiceProvider.CreateScope();
21-
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IRefitApi>();
21+
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IRefitJsonApi>();
2222
return await benchmarkApi.PutFormAsync(id: "id001", User.Instance);
2323
}
2424
}

WebApiClientCore.Benchmarks/Requests/IRefitApi.cs renamed to WebApiClientCore.Benchmarks/Requests/IRefitJsonApi.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace WebApiClientCore.Benchmarks.Requests
55
{
6-
public interface IRefitApi
6+
public interface IRefitJsonApi
77
{
88
[Get("/benchmarks/{id}")]
99
Task GetAsync(string id);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using Refit;
2+
using System.Threading.Tasks;
3+
4+
namespace WebApiClientCore.Benchmarks.Requests
5+
{
6+
public interface IRefitXmlApi
7+
{
8+
[Post("/benchmarks")]
9+
Task<User> PostXmlAsync([Body(BodySerializationMethod.Serialized)] User model);
10+
}
11+
}

WebApiClientCore.Benchmarks/Requests/IWebApiClientCoreApi.cs renamed to WebApiClientCore.Benchmarks/Requests/IWebApiClientCoreJsonApi.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ namespace WebApiClientCore.Benchmarks.Requests
55
{
66
[JsonReturn]
77
[XmlReturn(Enable = false)]
8-
public interface IWebApiClientCoreApi
8+
public interface IWebApiClientCoreJsonApi
99
{
1010
[HttpGet("/benchmarks/{id}")]
1111
Task GetAsync(string id);
1212

1313
[HttpGet("/benchmarks/{id}")]
14-
Task<User> GetJsonAsync(string id);
14+
Task<User> GetJsonAsync(string id);
1515

1616
[HttpPost("/benchmarks")]
1717
Task<User> PostJsonAsync([JsonContent] User model);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using System.Threading.Tasks;
2+
using WebApiClientCore.Attributes;
3+
4+
namespace WebApiClientCore.Benchmarks.Requests
5+
{
6+
[XmlReturn]
7+
[JsonReturn(Enable = false)]
8+
public interface IWebApiClientCoreXmlApi
9+
{
10+
[HttpPost("/benchmarks")]
11+
Task<User> PostXmlAsync([XmlContent] User model);
12+
}
13+
}

WebApiClientCore.Benchmarks/User.cs

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.IO;
22
using System.Text.Json;
33
using System.Text.Json.Serialization;
4+
using WebApiClientCore.Serialization;
45

56
namespace WebApiClientCore.Benchmarks
67
{
@@ -26,12 +27,14 @@ public class User
2627

2728

2829
public static User Instance { get; }
29-
public static byte[] Utf8Array { get; }
30+
public static byte[] Utf8Json { get; }
31+
public static string XmlString { get; set; }
3032

3133
static User()
3234
{
33-
Utf8Array = File.ReadAllBytes("user.json");
34-
Instance = JsonSerializer.Deserialize<User>(Utf8Array);
35+
Utf8Json = File.ReadAllBytes("user.json");
36+
Instance = JsonSerializer.Deserialize<User>(Utf8Json);
37+
XmlString = XmlSerializer.Serialize(Instance, null);
3538
}
3639
}
3740
}

WebApiClientCore.Benchmarks/WebApiClientCore.Benchmarks.csproj

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>netcoreapp3.1;net8.0</TargetFrameworks>
4+
<TargetFramework>net8.0</TargetFramework>
55
<OutputType>Exe</OutputType>
6+
<EnableCompressionInSingleFile>true</EnableCompressionInSingleFile>
67
<SignAssembly>true</SignAssembly>
78
<AssemblyOriginatorKeyFile>Sign.snk</AssemblyOriginatorKeyFile>
8-
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
9+
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
910
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
1011
</PropertyGroup>
1112

1213
<ItemGroup>
1314
<PackageReference Include="BenchmarkDotNet" Version="0.13.12" />
1415
<PackageReference Include="Refit.HttpClientFactory" Version="7.0.0" />
16+
<PackageReference Include="Refit.Xml" Version="7.0.0" />
1517
</ItemGroup>
1618

1719
<ItemGroup>

0 commit comments

Comments
 (0)