XFEExtension.NetCore.ServerInteractive
[DLL] Server interaction extension, including user identity verification and querying in conjunction with AutoConfig
关注
0
Fork
0
Star
0
返回提交历史
Modified
XFEExtension.NetCore.ServerInteractive.Test/Program.cs
+1
-1
Modified
XFEExtension.NetCore.ServerInteractive/Implements/Requester/StandardRequestServiceBase.cs
+1
-1
Modified
XFEExtension.NetCore.ServerInteractive/Interfaces/Requester/IRequestServiceBase.cs
+1
-1
Modified
XFEExtension.NetCore.ServerInteractive/Models/ServerModels/ServerCoreReturnArgs.cs
+5
-0
Modified
XFEExtension.NetCore.ServerInteractive/Utilities/DataTable/XFEDataDictionaryTable.cs
+3
-3
Modified
XFEExtension.NetCore.ServerInteractive/Utilities/DataTable/XFEDataListTable.cs
+3
-3
Modified
XFEExtension.NetCore.ServerInteractive/Utilities/DataTable/XFEDataTableManager.cs
+2
-2
Renamed
XFEExtension.NetCore.ServerInteractive/Utilities/Extensions/ClientRequesterBuilderExtensions.cs
+9
-9
Modified
XFEExtension.NetCore.ServerInteractive/Utilities/Extensions/XFEServerCoreBuilderExtensions.cs
+0
-27
Renamed
XFEExtension.NetCore.ServerInteractive/Utilities/Requester/ClientRequester.cs
+7
-3
Renamed
XFEExtension.NetCore.ServerInteractive/Utilities/Requester/ClientRequesterBuilder.cs
+35
-12
Modified
XFEExtension.NetCore.ServerInteractive/Utilities/Requester/TableRequester.cs
+2
-1
Modified
XFEExtension.NetCore.ServerInteractive/Utilities/Server/Services/CoreService/XFEDataTableManagerService.cs
+1
-6
Modified
XFEExtension.NetCore.ServerInteractive/Utilities/Server/XFEServerCore.cs
+2
-1
XFEstudio/XFEExtension.NetCore.ServerInteractive
优化部分代码
ec070c9
代码差异
14 个文件
+72
-70
@@ -10,7 +10,7 @@ namespace XFEExtension.NetCore.ServerInteractive.Test;
10
10
11
11
internal class Program
12
12
{
13
private static readonly XFEClientRequester s_xFEClientRequester = XFEClientRequesterBuilder.CreateBuilder()
13
private static readonly ClientRequester s_xFEClientRequester = ClientRequesterBuilder.CreateBuilder()
14
14
.UseXFEStandardRequest<UserFaceInfo>()
15
15
.AddRequest("test", (_, _, _) => new
16
16
{
@@ -26,7 +26,7 @@ public abstract class StandardRequestServiceBase : IStandardRequestService
26
26
/// <inheritdoc/>
27
27
public object[] Parameters { get; set; } = [];
28
28
/// <inheritdoc/>
29
public XFEClientRequester XFEClientRequester { get; set; }
29
public ClientRequester XFEClientRequester { get; set; }
30
30
31
31
/// <inheritdoc/>
32
32
public virtual Dictionary<string, Func<object>> RequestPoints { get; } = new();
@@ -10,5 +10,5 @@ public interface IRequestServiceBase
10
10
/// <summary>
11
11
/// XFE客户端请求器
12
12
/// </summary>
13
XFEClientRequester XFEClientRequester { get; set; }
13
ClientRequester XFEClientRequester { get; set; }
14
14
}
@@ -1,6 +1,7 @@
1
1
using System.Net;
2
2
using System.Text.Json;
3
3
using XFEExtension.NetCore.CyberComm;
4
using XFEExtension.NetCore.ServerInteractive.Utilities.Server;
4
5
5
6
namespace XFEExtension.NetCore.ServerInteractive.Models.ServerModels;
6
7
@@ -33,6 +34,10 @@ public class ServerCoreReturnArgs : Exception
33
34
/// 本次异常服务器参数
34
35
/// </summary>
35
36
public required CyberCommRequestEventArgs Args { get; set; }
37
/// <summary>
38
/// 服务器核心实例(如果需要在异常处理中访问服务器核心的相关信息或方法,可以通过此属性访问)
39
/// </summary>
40
public required XFEServerCore ServerCore { get; set; }
36
41
37
42
/// <summary>
38
43
/// Sends a reply message asynchronously using the current context.
@@ -199,14 +199,14 @@ public class XFEDataDictionaryTable<TValue> : IXFEDataTable where TValue : IIdMo
199
199
r.Args.Close();
200
200
break;
201
201
default:
202
Console.WriteLine($"[ERROR] 意料之外的方法:{execute}");
203
await r.Args.ReplyAndClose($"意料之外的方法:{execute}", HttpStatusCode.BadRequest);
202
Console.WriteLine($"[ERROR] 试图查询不存在的表格:{execute}");
203
await r.Args.ReplyAndClose($"试图查询不存在的表格:{execute}", HttpStatusCode.BadRequest);
204
204
break;
205
205
}
206
206
}
207
207
catch (Exception ex)
208
208
{
209
Console.WriteLine($"[WARN]【{r.Args.ClientIP}】{ex.Message}");
209
Console.WriteLine($"[WARN]({r.ServerCore.ServerCoreName}){ex.Message}");
210
210
Console.WriteLine($"[TRACE]{ex.StackTrace}");
211
211
await r.Args.ReplyAndClose(ex.Message, statusCode);
212
212
}
@@ -208,14 +208,14 @@ public class XFEDataListTable<T> : IXFEDataTable where T : IIdModel
208
208
r.Args.Close();
209
209
break;
210
210
default:
211
Console.WriteLine($"[ERROR] 意料之外的方法:{execute}");
212
await r.Args.ReplyAndClose($"意料之外的方法:{execute}", HttpStatusCode.BadRequest);
211
Console.WriteLine($"[ERROR] 试图查询不存在的表格:{execute}");
212
await r.Args.ReplyAndClose($"试图查询不存在的表格:{execute}", HttpStatusCode.BadRequest);
213
213
break;
214
214
}
215
215
}
216
216
catch (Exception ex)
217
217
{
218
Console.WriteLine($"[WARN]【{r.Args.ClientIP}】{ex.Message}");
218
Console.WriteLine($"[WARN]({r.ServerCore.ServerCoreName}){ex.Message}");
219
219
Console.WriteLine($"[TRACE]{ex.StackTrace}");
220
220
await r.Args.ReplyAndClose(ex.Message, statusCode);
221
221
}
@@ -36,8 +36,8 @@ public abstract class XFEDataTableManager
36
36
}
37
37
else
38
38
{
39
Console.WriteLine($"[ERROR]【{r.Args.ClientIP}】意料之外的表格:{split[1]}");
40
await r.Args.ReplyAndClose($"意料之外的方法:{execute}", HttpStatusCode.BadRequest);
39
Console.WriteLine($"[ERROR]({r.ServerCore.ServerCoreName})【{r.Args.ClientIP}】试图查询不存在的表格:{split[1]}");
40
await r.Args.ReplyAndClose($"试图查询不存在的表格:{execute}", HttpStatusCode.BadRequest);
41
41
}
42
42
}
43
43
}
@@ -8,22 +8,22 @@ using XFEExtension.NetCore.ServerInteractive.Utilities.Requester.Services;
8
8
namespace XFEExtension.NetCore.ServerInteractive.Utilities.Extensions;
9
9
10
10
/// <summary>
11
/// XFE客户端请求器构建器扩展
11
/// 客户端请求器构建器扩展
12
12
/// </summary>
13
public static class XFEClientRequesterBuilderExtensions
13
public static class ClientRequesterBuilderExtensions
14
14
{
15
15
private static readonly JsonSerializerOptions JsonSerializerOptions = new();
16
16
17
static XFEClientRequesterBuilderExtensions() => JsonSerializerOptions.Converters.Add(new JsonDateTimeConverter());
17
static ClientRequesterBuilderExtensions() => JsonSerializerOptions.Converters.Add(new JsonDateTimeConverter());
18
18
19
19
/// <param name="xFEClientRequesterBuilder"></param>
20
extension(XFEClientRequesterBuilder xFEClientRequesterBuilder)
20
extension(ClientRequesterBuilder xFEClientRequesterBuilder)
21
21
{
22
22
/// <summary>
23
23
/// 添加连接检查请求
24
24
/// </summary>
25
25
/// <returns></returns>
26
public XFEClientRequesterBuilder AddCheckConnectRequest() => xFEClientRequesterBuilder.AddRequest("check_connect", static (_, _, _) => new
26
public ClientRequesterBuilder AddCheckConnectRequest() => xFEClientRequesterBuilder.AddRequest("check_connect", static (_, _, _) => new
27
27
{
28
28
execute = "check_connect"
29
29
}, response => DateTime.Parse(response));
@@ -32,13 +32,13 @@ public static class XFEClientRequesterBuilderExtensions
32
32
/// 添加日志请求
33
33
/// </summary>
34
34
/// <returns></returns>
35
public XFEClientRequesterBuilder AddLogRequest() => xFEClientRequesterBuilder.AddRequest<LogRequestService>();
35
public ClientRequesterBuilder AddLogRequest() => xFEClientRequesterBuilder.AddRequest<LogRequestService>();
36
36
37
37
/// <summary>
38
38
/// 添加IP封禁请求
39
39
/// </summary>
40
40
/// <returns></returns>
41
public XFEClientRequesterBuilder AddBannedIPRequest() => xFEClientRequesterBuilder.AddRequest("get_bannedIPList", static (session, deviceInfo, _) => new
41
public ClientRequesterBuilder AddBannedIPRequest() => xFEClientRequesterBuilder.AddRequest("get_bannedIPList", static (session, deviceInfo, _) => new
42
42
{
43
43
execute = "get_bannedIPList",
44
44
session,
@@ -63,14 +63,14 @@ public static class XFEClientRequesterBuilderExtensions
63
63
/// </summary>
64
64
/// <typeparam name="T">登录返回用户接口类型</typeparam>
65
65
/// <returns></returns>
66
public XFEClientRequesterBuilder AddLoginRequest<T>() where T : IUserFaceInfo => xFEClientRequesterBuilder.AddRequest<UserRequestService<T>>();
66
public ClientRequesterBuilder AddLoginRequest<T>() where T : IUserFaceInfo => xFEClientRequesterBuilder.AddRequest<UserRequestService<T>>();
67
67
68
68
/// <summary>
69
69
/// 使用XFE标准服务器服务请求
70
70
/// </summary>
71
71
/// <typeparam name="T">登录返回用户接口类型</typeparam>
72
72
/// <returns></returns>
73
public XFEClientRequesterBuilder UseXFEStandardRequest<T>() where T : IUserFaceInfo => xFEClientRequesterBuilder.AddLoginRequest<T>()
73
public ClientRequesterBuilder UseXFEStandardRequest<T>() where T : IUserFaceInfo => xFEClientRequesterBuilder.AddLoginRequest<T>()
74
74
.AddBannedIPRequest()
75
75
.AddLogRequest()
76
76
.AddCheckConnectRequest();
@@ -26,8 +26,6 @@ public static class XFEServerCoreBuilderExtensions
26
26
{
27
27
xFEServerCoreBuilder.AddParameter("TableManager", xFEDataTableManagerBuilder.Build(getUserFunction, getEncryptedUserLoginModelFunction));
28
28
29
// Register the service for each table operation route
30
// XFEDataTableManagerService uses dynamic routing, so we use AddServiceWithRoute
31
29
foreach (var execute in xFEDataTableManagerBuilder.ExecuteList)
32
30
{
33
31
var parts = execute.Split('_', 2);
@@ -134,47 +132,22 @@ public static class XFEServerCoreBuilderExtensions
134
132
public XFEServerCoreBuilder UseXFEStandardServerCore<T>(XFEStandardServerCoreOptions<T>? options) where T : class
135
133
{
136
134
if (options is null) return xFEServerCoreBuilder;
137
138
// start with base builder
139
135
var builder = xFEServerCoreBuilder;
140
141
// If user-related functions are provided, add user parameters and login services
142
136
var hasUserFunctions = options.GetUserFunction is not null && options.AddUserFunction is not null && options.GetEncryptedUserLoginModelFunction is not null && options.AddEncryptedUserLoginModelFunction is not null && options.RemoveEncryptedUserLoginModelFunction is not null && options.LoginResultConvertFunction is not null;
143
144
137
if (hasUserFunctions)
145
{
146
138
builder = builder.AddUserParameterBase(options.GetUserFunction!, options.AddUserFunction!, options.GetEncryptedUserLoginModelFunction!, options.AddEncryptedUserLoginModelFunction!, options.RemoveEncryptedUserLoginModelFunction!, options.GetLoginKeepDays, options.LoginResultConvertFunction!);
147
}
148
149
// DataTableManager requires both user functions and a builder
150
139
if (options.DataTableManagerBuilder is not null && options.GetUserFunction is not null && options.GetEncryptedUserLoginModelFunction is not null)
151
{
152
140
builder = builder.AddDataTableManager(options.DataTableManagerBuilder, options.GetUserFunction, options.GetEncryptedUserLoginModelFunction);
153
}
154
155
// Common services that don't strictly require user functions
156
141
if (options.UseEntryPointVerifyService)
157
{
158
142
builder = builder.AddEntryPointVerify();
159
}
160
143
if (options.UseDailyCounterService)
161
{
162
144
builder = builder.AddDailyCounterService();
163
}
164
145
if (options.UseXFEErrorProcessService)
165
{
166
146
builder = builder.AddXFEErrorProcessService();
167
}
168
147
if (options.UseConnectService)
169
{
170
148
builder = builder.AddConnectService();
171
}
172
// Add services that depend on user functions if available
173
149
if (hasUserFunctions)
174
{
175
150
builder = builder.AddStandardLoginService<T>().AddServerLogService().AddIPBannerService();
176
}
177
178
151
return builder;
179
152
}
180
153
@@ -12,10 +12,10 @@ using XFEExtension.NetCore.ServerInteractive.Utilities.JsonConverter;
12
12
namespace XFEExtension.NetCore.ServerInteractive.Utilities.Requester;
13
13
14
14
/// <summary>
15
/// XFE客户端请求器
15
/// 客户端请求器
16
16
/// </summary>
17
17
[CreateImpl]
18
public abstract class XFEClientRequester : IRequesterBase
18
public abstract class ClientRequester : IRequesterBase
19
19
{
20
20
private readonly JsonSerializerOptions _jsonSerializerOptions = new();
21
21
internal Dictionary<string, Func<IRequestService>> RequestServiceDictionary = [];
@@ -28,13 +28,17 @@ public abstract class XFEClientRequester : IRequesterBase
28
28
public string Session { get; set; } = string.Empty;
29
29
/// <inheritdoc/>
30
30
public string DeviceInfo { get; set; } = string.Empty;
31
/// <summary>
32
/// 表格请求器(如需使用表格相关功能,请通过构建器添加WithTableRequester实例并赋值此属性)
33
/// </summary>
34
public TableRequester? TableRequester { get; set; }
31
35
/// <inheritdoc/>
32
36
public event XFEEventHandler<object?, ServerInteractiveEventArgs>? MessageReceived;
33
37
34
38
/// <summary>
35
39
/// XFE客户端请求器
36
40
/// </summary>
37
protected XFEClientRequester()
41
protected ClientRequester()
38
42
{
39
43
_jsonSerializerOptions.Converters.Add(new JsonDateTimeConverter());
40
44
}
@@ -4,16 +4,17 @@ using XFEExtension.NetCore.ServerInteractive.Interfaces.Requester;
4
4
using XFEExtension.NetCore.ServerInteractive.Models.RequesterModels;
5
5
using XFEExtension.NetCore.ServerInteractive.Options;
6
6
using XFEExtension.NetCore.ServerInteractive.Utilities.Helpers;
7
using XFEExtension.NetCore.StringExtension;
7
8
8
9
namespace XFEExtension.NetCore.ServerInteractive.Utilities.Requester;
9
10
10
11
/// <summary>
11
/// XFE客户端请求器构建器
12
/// 客户端请求器构建器
12
13
/// </summary>
13
14
[CreateImpl]
14
public abstract class XFEClientRequesterBuilder : XFEBuilderBase<XFEClientRequesterBuilder>
15
public abstract class ClientRequesterBuilder : XFEBuilderBase<ClientRequesterBuilder>
15
16
{
16
private readonly XFEClientRequester _xFEClientRequester = new XFEClientRequesterImpl();
17
private readonly ClientRequester _xFEClientRequester = new ClientRequesterImpl();
17
18
private readonly Dictionary<string, Func<IRequestService>> _requestServiceDictionary = [];
18
19
private readonly Dictionary<string, Func<IStandardRequestService>> _standardRequestServiceDictionary = [];
19
20
private readonly List<(string Pattern, Func<IStandardRequestService> Factory)> _wildcardStandardRequestServiceList = [];
@@ -22,9 +23,9 @@ public abstract class XFEClientRequesterBuilder : XFEBuilderBase<XFEClientReques
22
23
/// 创建构建器
23
24
/// </summary>
24
25
/// <returns></returns>
25
public static XFEClientRequesterBuilder CreateBuilder()
26
public static ClientRequesterBuilder CreateBuilder()
26
27
{
27
var builder = new XFEClientRequesterBuilderImpl();
28
var builder = new ClientRequesterBuilderImpl();
28
29
builder.AddParameter("XFEClientRequester", builder._xFEClientRequester);
29
30
return builder;
30
31
}
@@ -35,7 +36,7 @@ public abstract class XFEClientRequesterBuilder : XFEBuilderBase<XFEClientReques
35
36
/// <typeparam name="T">请求服务泛型</typeparam>
36
37
/// <param name="serviceName">请求名称</param>
37
38
/// <returns></returns>
38
public XFEClientRequesterBuilder AddOriginRequest<T>(string serviceName) where T : IRequestService, new()
39
public ClientRequesterBuilder AddOriginRequest<T>(string serviceName) where T : IRequestService, new()
39
40
{
40
41
_requestServiceDictionary.Add(serviceName, () =>
41
42
{
@@ -51,7 +52,7 @@ public abstract class XFEClientRequesterBuilder : XFEBuilderBase<XFEClientReques
51
52
/// </summary>
52
53
/// <typeparam name="T">请求服务泛型</typeparam>
53
54
/// <returns></returns>
54
public XFEClientRequesterBuilder AddRequest<T>() where T : IStandardRequestService, new()
55
public ClientRequesterBuilder AddRequest<T>() where T : IStandardRequestService, new()
55
56
{
56
57
var probeService = new T();
57
58
ApplyParameter(probeService);
@@ -78,7 +79,8 @@ public abstract class XFEClientRequesterBuilder : XFEBuilderBase<XFEClientReques
78
79
var inst = new T();
79
80
ApplyParameter(inst);
80
81
return inst;
81
}));
82
}
83
));
82
84
}
83
85
else
84
86
{
@@ -102,7 +104,7 @@ public abstract class XFEClientRequesterBuilder : XFEBuilderBase<XFEClientReques
102
104
/// <param name="route">路径</param>
103
105
/// <param name="xFEClientInstanceRequest">请求实例</param>
104
106
/// <returns></returns>
105
public XFEClientRequesterBuilder AddRequest(string route, StandardClientInstanceRequest xFEClientInstanceRequest)
107
public ClientRequesterBuilder AddRequest(string route, StandardClientInstanceRequest xFEClientInstanceRequest)
106
108
{
107
109
_standardClientInstanceRequestDictionary.Add(route, xFEClientInstanceRequest);
108
110
return this;
@@ -115,21 +117,42 @@ public abstract class XFEClientRequesterBuilder : XFEBuilderBase<XFEClientReques
115
117
/// <param name="constructBody">构造请求体方法<seealso cref="object"/> (<seealso cref="string"/> session, <seealso cref="string"/> deviceInfo, <seealso cref="object"/>[] parameters)</param>
116
118
/// <param name="processResponse">处理响应方法<seealso cref="object"/> (<seealso cref="string"/> response)</param>
117
119
/// <returns></returns>
118
public XFEClientRequesterBuilder AddRequest(string route, Func<string, string, object[], object> constructBody, Func<string, object>? processResponse = null) => AddRequest(route, new StandardClientInstanceRequest
120
public ClientRequesterBuilder AddRequest(string route, Func<string, string, object[], object> constructBody, Func<string, object>? processResponse = null) => AddRequest(route, new StandardClientInstanceRequest
119
121
{
120
122
ConstructBody = constructBody,
121
123
ProcessResponse = processResponse
122
124
});
123
125
126
/// <summary>
127
/// 使用表格请求器
128
/// </summary>
129
/// <param name="tableRequester"></param>
130
/// <returns></returns>
131
public ClientRequesterBuilder UseTableRequester(TableRequester? tableRequester = null)
132
{
133
tableRequester ??= new();
134
_xFEClientRequester.TableRequester = tableRequester;
135
return this;
136
}
137
124
138
/// <summary>
125
139
/// 构建XFE客户端请求器
126
140
/// </summary>
127
141
/// <returns>XFE客户端请求器</returns>
128
public XFEClientRequester Build(XFEClientRequesterOptions options)
142
public ClientRequester Build(XFEClientRequesterOptions options)
129
143
{
130
144
_xFEClientRequester.RequestAddress = options.RequestAddress;
131
145
_xFEClientRequester.Session = options.Session;
132
146
_xFEClientRequester.DeviceInfo = options.DeviceInfo;
147
if (_xFEClientRequester.TableRequester is not null)
148
{
149
if (_xFEClientRequester.TableRequester.RequestAddress.NullOrEmpty)
150
_xFEClientRequester.TableRequester.RequestAddress = options.RequestAddress;
151
if (_xFEClientRequester.TableRequester.DeviceInfo.NullOrEmpty)
152
_xFEClientRequester.TableRequester.DeviceInfo = options.DeviceInfo;
153
if (_xFEClientRequester.TableRequester.Session.NullOrEmpty)
154
_xFEClientRequester.TableRequester.Session = options.Session;
155
}
133
156
_xFEClientRequester.RequestServiceDictionary = _requestServiceDictionary;
134
157
_xFEClientRequester.StandardRequestServiceDictionary = _standardRequestServiceDictionary;
135
158
_xFEClientRequester.WildcardStandardRequestServiceList = _wildcardStandardRequestServiceList;
@@ -141,7 +164,7 @@ public abstract class XFEClientRequesterBuilder : XFEBuilderBase<XFEClientReques
141
164
/// 构建XFE客户端请求器
142
165
/// </summary>
143
166
/// <returns>XFE客户端请求器</returns>
144
public XFEClientRequester Build(Action<XFEClientRequesterOptions> optionsBuilder)
167
public ClientRequester Build(Action<XFEClientRequesterOptions> optionsBuilder)
145
168
{
146
169
var options = new XFEClientRequesterOptions();
147
170
optionsBuilder(options);
@@ -2,6 +2,7 @@
2
2
using System.Text;
3
3
using System.Text.Json;
4
4
using XFEExtension.NetCore.DelegateExtension;
5
using XFEExtension.NetCore.ServerInteractive.Interfaces.Requester;
5
6
using XFEExtension.NetCore.ServerInteractive.Models;
6
7
using XFEExtension.NetCore.ServerInteractive.Models.RequesterModels;
7
8
using XFEExtension.NetCore.ServerInteractive.Utilities.Helpers;
@@ -12,7 +13,7 @@ namespace XFEExtension.NetCore.ServerInteractive.Utilities.Requester;
12
13
/// <summary>
13
14
/// 表格请求器
14
15
/// </summary>
15
public class TableRequester
16
public class TableRequester : IRequesterBase
16
17
{
17
18
/// <summary>
18
19
/// 请求地址