Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
43 changes: 43 additions & 0 deletions WebApiClientCore.Benchmarks/Requests/Benchmark.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using BenchmarkDotNet.Attributes;
using Microsoft.Extensions.DependencyInjection;
using Refit;
using RestSharp;
using System;
using System.IO;
using System.Net;
Expand Down Expand Up @@ -57,13 +58,39 @@ 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<RestSharpJsonClient>(sp =>
{
var httpClient = sp.GetRequiredService<IHttpClientFactory>().CreateClient("RestSharpJsonClient");
return new RestSharpJsonClient(httpClient);
});

// 注册 RestSharp XML 客户端
services.AddTransient<RestSharpXmlClient>(sp =>
{
var httpClient = sp.GetRequiredService<IHttpClientFactory>().CreateClient("RestSharpXmlClient");
return new RestSharpXmlClient(httpClient);
});

this.ServiceProvider = services.BuildServiceProvider();

// 服务显式加载预热
this.ServiceProvider.GetService<IWebApiClientCoreJsonApi>();
this.ServiceProvider.GetService<IWebApiClientCoreXmlApi>();
this.ServiceProvider.GetService<IRefitJsonApi>();
this.ServiceProvider.GetService<IRefitXmlApi>();
this.ServiceProvider.GetService<RestSharpJsonClient>();
this.ServiceProvider.GetService<RestSharpXmlClient>();
}

private class JsonResponseHandler : DelegatingHandler
Expand Down Expand Up @@ -95,5 +122,21 @@ protected override Task<HttpResponseMessage> 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)
{
}
}
}
}
10 changes: 10 additions & 0 deletions WebApiClientCore.Benchmarks/Requests/HttpGetBenchmark.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using BenchmarkDotNet.Attributes;
using Microsoft.Extensions.DependencyInjection;
using RestSharp;
using System.Threading.Tasks;

namespace WebApiClientCore.Benchmarks.Requests
Expand All @@ -21,5 +22,14 @@ public async Task Refit_GetAsync()
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IRefitJsonApi>();
await benchmarkApi.GetAsync(id: "id001");
}

[Benchmark]
public async Task RestSharp_GetAsync()
{
using var scope = this.ServiceProvider.CreateScope();
var client = scope.ServiceProvider.GetRequiredService<RestSharpJsonClient>();
var request = new RestRequest($"/benchmarks/id001");
await client.ExecuteAsync(request);
}
}
}
12 changes: 11 additions & 1 deletion WebApiClientCore.Benchmarks/Requests/HttpGetJsonBenchmark.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Attributes;
using Microsoft.Extensions.DependencyInjection;
using RestSharp;
using System.Threading.Tasks;

namespace WebApiClientCore.Benchmarks.Requests
Expand All @@ -21,5 +22,14 @@ public async Task<User> Refit_GetJsonAsync()
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IRefitJsonApi>();
return await benchmarkApi.GetJsonAsync(id: "id001");
}

[Benchmark]
public async Task<User> RestSharp_GetJsonAsync()
{
using var scope = this.ServiceProvider.CreateScope();
var client = scope.ServiceProvider.GetRequiredService<RestSharpJsonClient>();
var request = new RestRequest($"/benchmarks/id001");
return await client.GetAsync<User>(request);
}
}
}
15 changes: 13 additions & 2 deletions WebApiClientCore.Benchmarks/Requests/HttpPostJsonBenchmark.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Attributes;
using Microsoft.Extensions.DependencyInjection;
using RestSharp;
using System.Threading.Tasks;

namespace WebApiClientCore.Benchmarks.Requests
Expand All @@ -19,8 +20,18 @@ public async Task<User> WebApiClientCore_PostJsonAsync()
public async Task<User> Refit_PostJsonAsync()
{
using var scope = this.ServiceProvider.CreateScope();
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IRefitJsonApi>();
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IRefitJsonApi>();
return await benchmarkApi.PostJsonAsync(User.Instance);
}

[Benchmark]
public async Task<User> RestSharp_PostJsonAsync()
{
using var scope = this.ServiceProvider.CreateScope();
var client = scope.ServiceProvider.GetRequiredService<RestSharpJsonClient>();
var request = new RestRequest($"/benchmarks")
.AddJsonBody(User.Instance);
return await client.PostAsync<User>(request);
}
}
}
15 changes: 14 additions & 1 deletion WebApiClientCore.Benchmarks/Requests/HttpPostXmlBenchmark.cs
Original file line number Diff line number Diff line change
@@ -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
{
Expand All @@ -21,5 +24,15 @@ public async Task<User> Refit_PostXmlAsync()
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IRefitXmlApi>();
return await benchmarkApi.PostXmlAsync(User.Instance);
}

[Benchmark]
public async Task<User> RestSharp_PostXmlAsync()
{
using var scope = this.ServiceProvider.CreateScope();
var client = scope.ServiceProvider.GetRequiredService<RestSharpXmlClient>();
var request = new RestRequest($"/benchmarks")
.AddXmlBody(User.Instance);
return await client.PostAsync<User>(request);
}
}
}
16 changes: 16 additions & 0 deletions WebApiClientCore.Benchmarks/Requests/HttpPutFormBenchmark.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using BenchmarkDotNet.Attributes;
using Microsoft.Extensions.DependencyInjection;
using RestSharp;
using System.Threading.Tasks;

namespace WebApiClientCore.Benchmarks.Requests
Expand All @@ -21,5 +22,20 @@ public async Task<User> Refit_PutFormAsync()
var benchmarkApi = scope.ServiceProvider.GetRequiredService<IRefitJsonApi>();
return await benchmarkApi.PutFormAsync(id: "id001", User.Instance);
}

[Benchmark]
public async Task<User> RestSharp_PutFormAsync()
{
using var scope = this.ServiceProvider.CreateScope();
var client = scope.ServiceProvider.GetRequiredService<RestSharpJsonClient>();
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<User>(request);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>netcoreapp3.1;net5.0;net8.0;net10.0</TargetFrameworks>
Expand All @@ -16,6 +16,7 @@
<PackageReference Include="BenchmarkDotNet" Version="0.15.7" />
<PackageReference Include="Refit.HttpClientFactory" Version="8.0.0" />
<PackageReference Include="Refit.Xml" Version="8.0.0" />
<PackageReference Include="RestSharp" Version="112.0.0" />
</ItemGroup>

<ItemGroup>
Expand Down