diff --git a/src/SKIT.FlurlHttpClient.Wechat/IWechatClient.cs b/src/SKIT.FlurlHttpClient.Wechat/IWechatClient.cs
index ac750c4d..61b1d247 100644
--- a/src/SKIT.FlurlHttpClient.Wechat/IWechatClient.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat/IWechatClient.cs
@@ -9,6 +9,11 @@ namespace SKIT.FlurlHttpClient.Wechat
///
public interface IWechatClient : IDisposable
{
+ ///
+ /// 获取当前客户端的拦截器集合。
+ ///
+ public WechatHttpCallInterceptorCollection Interceptors { get; }
+
///
/// 配置客户端。
///
diff --git a/src/SKIT.FlurlHttpClient.Wechat/WechatClientBase.cs b/src/SKIT.FlurlHttpClient.Wechat/WechatClientBase.cs
index 5d7bb619..2759a668 100644
--- a/src/SKIT.FlurlHttpClient.Wechat/WechatClientBase.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat/WechatClientBase.cs
@@ -16,19 +16,39 @@ namespace SKIT.FlurlHttpClient.Wechat
public abstract class WechatClientBase : IWechatClient
{
///
- ///
+ ///
///
- protected IFlurlClient ProxyFlurlClient { get; }
+ public WechatHttpCallInterceptorCollection Interceptors { get; }
+
+ ///
+ /// 获取当前客户端使用的 对象。
+ ///
+ protected IFlurlClient FlurlClient { get; }
///
///
///
protected WechatClientBase()
{
- ProxyFlurlClient = new FlurlClient();
- ProxyFlurlClient.Configure(settings =>
+ Interceptors = new WechatHttpCallInterceptorCollection();
+ FlurlClient = new FlurlClient();
+ FlurlClient.Configure(flurlSettings =>
{
- settings.JsonSerializer = new FlurlSystemTextJsonSerializer();
+ flurlSettings.JsonSerializer = new FlurlSystemTextJsonSerializer();
+ flurlSettings.BeforeCallAsync = async (flurlCall) =>
+ {
+ for (int i = 0, len = Interceptors.Count; i < len; i++)
+ {
+ await Interceptors[i].BeforeCallAsync(flurlCall);
+ }
+ };
+ flurlSettings.AfterCallAsync = async (flurlCall) =>
+ {
+ for (int i = Interceptors.Count - 1; i >= 0; i--)
+ {
+ await Interceptors[i].AfterCallAsync(flurlCall);
+ }
+ };
});
}
@@ -37,7 +57,7 @@ namespace SKIT.FlurlHttpClient.Wechat
{
if (configure == null) throw new ArgumentNullException(nameof(configure));
- ProxyFlurlClient.Configure(flurlSettings =>
+ FlurlClient.Configure(flurlSettings =>
{
var settings = new WechatClientSettings();
settings.Timeout = flurlSettings.Timeout;
@@ -64,24 +84,24 @@ namespace SKIT.FlurlHttpClient.Wechat
///
public IFlurlRequest CreateRequest(HttpMethod method, params object[] urlSegments)
{
- return ProxyFlurlClient.Request(urlSegments).WithVerb(method);
+ return FlurlClient.Request(urlSegments).WithVerb(method);
}
///
/// 异步发起请求。
///
- ///
+ ///
///
///
///
- protected virtual async Task SendRequestAsync(IFlurlRequest request, HttpContent? content = null, CancellationToken cancellationToken = default)
+ protected virtual async Task SendRequestAsync(IFlurlRequest flurlRequest, HttpContent? content = null, CancellationToken cancellationToken = default)
{
- if (request == null) throw new ArgumentNullException(nameof(request));
+ if (flurlRequest == null) throw new ArgumentNullException(nameof(flurlRequest));
- var response = await request
- .WithClient(ProxyFlurlClient)
+ var response = await flurlRequest
+ .WithClient(FlurlClient)
.AllowAnyHttpStatus()
- .SendAsync(request.Verb, content, cancellationToken)
+ .SendAsync(flurlRequest.Verb, content, cancellationToken)
.ConfigureAwait(false);
return response;
}
@@ -89,18 +109,18 @@ namespace SKIT.FlurlHttpClient.Wechat
///
/// 异步发起请求。
///
- ///
+ ///
///
///
///
- protected virtual async Task SendRequestWithJsonAsync(IFlurlRequest request, object? data = null, CancellationToken cancellationToken = default)
+ protected virtual async Task SendRequestWithJsonAsync(IFlurlRequest flurlRequest, object? data = null, CancellationToken cancellationToken = default)
{
- if (request == null) throw new ArgumentNullException(nameof(request));
+ if (flurlRequest == null) throw new ArgumentNullException(nameof(flurlRequest));
- var response = await request
- .WithClient(ProxyFlurlClient)
+ var response = await flurlRequest
+ .WithClient(FlurlClient)
.AllowAnyHttpStatus()
- .SendJsonAsync(request.Verb, data, cancellationToken)
+ .SendJsonAsync(flurlRequest.Verb, data, cancellationToken)
.ConfigureAwait(false);
return response;
}
@@ -110,7 +130,7 @@ namespace SKIT.FlurlHttpClient.Wechat
///
public virtual void Dispose()
{
- ProxyFlurlClient?.Dispose();
+ FlurlClient?.Dispose();
}
}
}
diff --git a/src/SKIT.FlurlHttpClient.Wechat/WechatHttpCallInterceptor.cs b/src/SKIT.FlurlHttpClient.Wechat/WechatHttpCallInterceptor.cs
new file mode 100644
index 00000000..ea4d8413
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat/WechatHttpCallInterceptor.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Flurl.Http;
+
+namespace SKIT.FlurlHttpClient.Wechat
+{
+ public abstract class WechatHttpCallInterceptor
+ {
+ public virtual Task BeforeCallAsync(FlurlCall flurlCall)
+ {
+ return Task.CompletedTask;
+ }
+
+ public virtual Task AfterCallAsync(FlurlCall flurlCall)
+ {
+ return Task.CompletedTask;
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat/WechatHttpCallInterceptorCollection.cs b/src/SKIT.FlurlHttpClient.Wechat/WechatHttpCallInterceptorCollection.cs
new file mode 100644
index 00000000..b6ebbd04
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat/WechatHttpCallInterceptorCollection.cs
@@ -0,0 +1,49 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SKIT.FlurlHttpClient.Wechat
+{
+ public sealed class WechatHttpCallInterceptorCollection : IEnumerable
+ {
+ private readonly IList _list;
+
+ public int Count
+ {
+ get { return _list.Count; }
+ }
+
+ public WechatHttpCallInterceptor this[int index]
+ {
+ get { return _list[index]; }
+ }
+
+ public WechatHttpCallInterceptorCollection()
+ {
+ _list = new List();
+ }
+
+ public void Add(WechatHttpCallInterceptor interceptor)
+ {
+ _list.Add(interceptor);
+ }
+
+ public void Remove(WechatHttpCallInterceptor interceptor)
+ {
+ _list.Remove(interceptor);
+ }
+
+ public IEnumerator GetEnumerator()
+ {
+ return _list.GetEnumerator();
+ }
+
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return ((IEnumerable)_list).GetEnumerator();
+ }
+ }
+}