diff --git a/WebApiClientCore.Benchmarks/Requests/Benchmark.cs b/WebApiClientCore.Benchmarks/Requests/Benchmark.cs index 8c6bbb82..0165b62e 100644 --- a/WebApiClientCore.Benchmarks/Requests/Benchmark.cs +++ b/WebApiClientCore.Benchmarks/Requests/Benchmark.cs @@ -1,6 +1,7 @@ using BenchmarkDotNet.Attributes; using Microsoft.Extensions.DependencyInjection; using Refit; +using RestSharp; using System; using System.IO; using System.Net; @@ -57,6 +58,30 @@ public void GlobalSetup() .AddHttpMessageHandler(() => new XmlResponseHandler()) .ConfigureHttpClient(c => c.BaseAddress = new Uri("http://webapiclient.com/")); + // 配置 RestSharp JSON 客户端 + services.AddHttpClient("RestSharpJsonClient") + .AddHttpMessageHandler(() => new JsonResponseHandler()) + .ConfigureHttpClient(c => c.BaseAddress = new Uri("http://webapiclient.com/")); + + // 配置 RestSharp XML 客户端 + services.AddHttpClient("RestSharpXmlClient") + .AddHttpMessageHandler(() => new XmlResponseHandler()) + .ConfigureHttpClient(c => c.BaseAddress = new Uri("http://webapiclient.com/")); + + // 注册 RestSharp JSON 客户端 + services.AddTransient(sp => + { + var httpClient = sp.GetRequiredService().CreateClient("RestSharpJsonClient"); + return new RestSharpJsonClient(httpClient); + }); + + // 注册 RestSharp XML 客户端 + services.AddTransient(sp => + { + var httpClient = sp.GetRequiredService().CreateClient("RestSharpXmlClient"); + return new RestSharpXmlClient(httpClient); + }); + this.ServiceProvider = services.BuildServiceProvider(); // 服务显式加载预热 @@ -64,6 +89,8 @@ public void GlobalSetup() this.ServiceProvider.GetService(); this.ServiceProvider.GetService(); this.ServiceProvider.GetService(); + this.ServiceProvider.GetService(); + this.ServiceProvider.GetService(); } private class JsonResponseHandler : DelegatingHandler @@ -95,5 +122,21 @@ protected override Task SendAsync(HttpRequestMessage reques return Task.FromResult(response); } } + + // RestSharp JSON客户端包装类 + public class RestSharpJsonClient : RestClient + { + public RestSharpJsonClient(HttpClient httpClient) : base(httpClient) + { + } + } + + // RestSharp XML客户端包装类 + public class RestSharpXmlClient : RestClient + { + public RestSharpXmlClient(HttpClient httpClient) : base(httpClient) + { + } + } } } diff --git a/WebApiClientCore.Benchmarks/Requests/HttpGetBenchmark.cs b/WebApiClientCore.Benchmarks/Requests/HttpGetBenchmark.cs index 79b2f4bf..56851e60 100644 --- a/WebApiClientCore.Benchmarks/Requests/HttpGetBenchmark.cs +++ b/WebApiClientCore.Benchmarks/Requests/HttpGetBenchmark.cs @@ -1,5 +1,6 @@ using BenchmarkDotNet.Attributes; using Microsoft.Extensions.DependencyInjection; +using RestSharp; using System.Threading.Tasks; namespace WebApiClientCore.Benchmarks.Requests @@ -21,5 +22,14 @@ public async Task Refit_GetAsync() var benchmarkApi = scope.ServiceProvider.GetRequiredService(); await benchmarkApi.GetAsync(id: "id001"); } + + [Benchmark] + public async Task RestSharp_GetAsync() + { + using var scope = this.ServiceProvider.CreateScope(); + var client = scope.ServiceProvider.GetRequiredService(); + var request = new RestRequest($"/benchmarks/id001"); + await client.ExecuteAsync(request); + } } } diff --git a/WebApiClientCore.Benchmarks/Requests/HttpGetJsonBenchmark.cs b/WebApiClientCore.Benchmarks/Requests/HttpGetJsonBenchmark.cs index 45ccebb7..eb461aef 100644 --- a/WebApiClientCore.Benchmarks/Requests/HttpGetJsonBenchmark.cs +++ b/WebApiClientCore.Benchmarks/Requests/HttpGetJsonBenchmark.cs @@ -1,5 +1,6 @@ -using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Attributes; using Microsoft.Extensions.DependencyInjection; +using RestSharp; using System.Threading.Tasks; namespace WebApiClientCore.Benchmarks.Requests @@ -21,5 +22,14 @@ public async Task Refit_GetJsonAsync() var benchmarkApi = scope.ServiceProvider.GetRequiredService(); return await benchmarkApi.GetJsonAsync(id: "id001"); } + + [Benchmark] + public async Task RestSharp_GetJsonAsync() + { + using var scope = this.ServiceProvider.CreateScope(); + var client = scope.ServiceProvider.GetRequiredService(); + var request = new RestRequest($"/benchmarks/id001"); + return await client.GetAsync(request); + } } } diff --git a/WebApiClientCore.Benchmarks/Requests/HttpPostJsonBenchmark.cs b/WebApiClientCore.Benchmarks/Requests/HttpPostJsonBenchmark.cs index 9ccaa97d..d8c93f9a 100644 --- a/WebApiClientCore.Benchmarks/Requests/HttpPostJsonBenchmark.cs +++ b/WebApiClientCore.Benchmarks/Requests/HttpPostJsonBenchmark.cs @@ -1,5 +1,6 @@ -using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Attributes; using Microsoft.Extensions.DependencyInjection; +using RestSharp; using System.Threading.Tasks; namespace WebApiClientCore.Benchmarks.Requests @@ -19,8 +20,18 @@ public async Task WebApiClientCore_PostJsonAsync() public async Task Refit_PostJsonAsync() { using var scope = this.ServiceProvider.CreateScope(); - var benchmarkApi = scope.ServiceProvider.GetRequiredService(); + var benchmarkApi = scope.ServiceProvider.GetRequiredService(); return await benchmarkApi.PostJsonAsync(User.Instance); } + + [Benchmark] + public async Task RestSharp_PostJsonAsync() + { + using var scope = this.ServiceProvider.CreateScope(); + var client = scope.ServiceProvider.GetRequiredService(); + var request = new RestRequest($"/benchmarks") + .AddJsonBody(User.Instance); + return await client.PostAsync(request); + } } } diff --git a/WebApiClientCore.Benchmarks/Requests/HttpPostXmlBenchmark.cs b/WebApiClientCore.Benchmarks/Requests/HttpPostXmlBenchmark.cs index f282158a..dbf7172c 100644 --- a/WebApiClientCore.Benchmarks/Requests/HttpPostXmlBenchmark.cs +++ b/WebApiClientCore.Benchmarks/Requests/HttpPostXmlBenchmark.cs @@ -1,6 +1,9 @@ -using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Attributes; using Microsoft.Extensions.DependencyInjection; +using RestSharp; +using System.Net.Http; using System.Threading.Tasks; +using System; namespace WebApiClientCore.Benchmarks.Requests { @@ -21,5 +24,15 @@ public async Task Refit_PostXmlAsync() var benchmarkApi = scope.ServiceProvider.GetRequiredService(); return await benchmarkApi.PostXmlAsync(User.Instance); } + + [Benchmark] + public async Task RestSharp_PostXmlAsync() + { + using var scope = this.ServiceProvider.CreateScope(); + var client = scope.ServiceProvider.GetRequiredService(); + var request = new RestRequest($"/benchmarks") + .AddXmlBody(User.Instance); + return await client.PostAsync(request); + } } } diff --git a/WebApiClientCore.Benchmarks/Requests/HttpPutFormBenchmark.cs b/WebApiClientCore.Benchmarks/Requests/HttpPutFormBenchmark.cs index 9672d6c1..73d14942 100644 --- a/WebApiClientCore.Benchmarks/Requests/HttpPutFormBenchmark.cs +++ b/WebApiClientCore.Benchmarks/Requests/HttpPutFormBenchmark.cs @@ -1,5 +1,6 @@ using BenchmarkDotNet.Attributes; using Microsoft.Extensions.DependencyInjection; +using RestSharp; using System.Threading.Tasks; namespace WebApiClientCore.Benchmarks.Requests @@ -21,5 +22,20 @@ public async Task Refit_PutFormAsync() var benchmarkApi = scope.ServiceProvider.GetRequiredService(); return await benchmarkApi.PutFormAsync(id: "id001", User.Instance); } + + [Benchmark] + public async Task RestSharp_PutFormAsync() + { + using var scope = this.ServiceProvider.CreateScope(); + var client = scope.ServiceProvider.GetRequiredService(); + var request = new RestRequest($"/benchmarks/id001") + .AddParameter("id", User.Instance.Id) + .AddParameter("name", User.Instance.Name) + .AddParameter("bio", User.Instance.Bio) + .AddParameter("followers", User.Instance.Followers) + .AddParameter("following", User.Instance.Following) + .AddParameter("url", User.Instance.Url); + return await client.PutAsync(request); + } } } diff --git a/WebApiClientCore.Benchmarks/WebApiClientCore.Benchmarks.csproj b/WebApiClientCore.Benchmarks/WebApiClientCore.Benchmarks.csproj index 8946fc7f..e0d2f07e 100644 --- a/WebApiClientCore.Benchmarks/WebApiClientCore.Benchmarks.csproj +++ b/WebApiClientCore.Benchmarks/WebApiClientCore.Benchmarks.csproj @@ -1,4 +1,4 @@ - + netcoreapp3.1;net5.0;net8.0;net10.0 @@ -16,6 +16,7 @@ +