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/CyberCommIntegrationTests.cs
+39
-0
Modified
XFEExtension.NetCore.ServerInteractive/Utilities/Server/XFEServerCoreHost.cs
+8
-8
Modified
XFEExtension.NetCore.ServerInteractive/XFEExtension.NetCore.ServerInteractive.csproj
+4
-2
XFEstudio/XFEExtension.NetCore.ServerInteractive
支持按本地监听端口分发请求,兼容CDN回源端口
新增测试用例验证按端口分发Direct IP、DNS及EdgeOne请求。FindServerCore与BindingEndpoint方法签名增加localPort参数,确保分发时匹配实际监听端口,解决CDN/EdgeOne回源端口与公开端口不一致问题。同步更新所有相关调用。依赖XFEExtension.NetCore升级至5.2.1,csproj发布说明补充相关兼容性说明。
c0c66e2
代码差异
3 个文件
+51
-10
@@ -313,6 +313,45 @@ public sealed class CyberCommIntegrationTests
313
313
Assert.Equal(HttpStatusCode.NotFound, missingResponse.StatusCode);
314
314
}
315
315
316
[Fact]
317
public async Task ServerInteractive_RoutesDirectIpDnsAndEdgeOneRequestsByOriginPort()
318
{
319
var originPort = GetFreePort();
320
var core = XFEServerCoreBuilder.CreateBuilder()
321
.AddConnectService()
322
.Build(options =>
323
{
324
options.ServerCoreName = "edge-one-origin";
325
options.MainEntryPoint = "api";
326
options.AcceptGet = true;
327
options.BindIP($"http://*:{originPort}/");
328
});
329
await using var server = XFEServerBuilder.CreateBuilder()
330
.AddXFEExceptionProcess()
331
.AddXFECoreProcessor()
332
.AddServerCore(core)
333
.Build();
334
await server.StartAsync();
335
336
var directIpResponse = await SendRawAsync(originPort,
337
"GET /api/check_connect HTTP/1.1\r\n" +
338
$"Host: 127.0.0.1:{originPort}\r\n" +
339
"Connection: close\r\n\r\n");
340
var directDnsResponse = await SendRawAsync(originPort,
341
"GET /api/check_connect HTTP/1.1\r\n" +
342
$"Host: toolbox.api.xfe.studio:{originPort}\r\n" +
343
"Connection: close\r\n\r\n");
344
var edgeOneResponse = await SendRawAsync(originPort,
345
"GET /api/check_connect HTTP/1.1\r\n" +
346
"Host: toolbox.api.xfe.studio\r\n" +
347
"X-Forwarded-Proto: http\r\n" +
348
"Connection: close\r\n\r\n");
349
350
Assert.StartsWith("HTTP/1.1 200", directIpResponse);
351
Assert.StartsWith("HTTP/1.1 200", directDnsResponse);
352
Assert.StartsWith("HTTP/1.1 200", edgeOneResponse);
353
}
354
316
355
[Fact]
317
356
public async Task TableRequester_AcceptsCreatedAndUsesPageSize()
318
357
{
@@ -127,7 +127,7 @@ internal sealed class XFEServerCoreHost
127
127
private async ValueTask ProcessHttpRequestAsync(CyberCommHttpRequestContext context, CancellationToken cancellationToken)
128
128
{
129
129
var args = CyberCommRequestEventArgs.FromContext(context);
130
var serverCore = FindServerCore(context.RequestUri);
130
var serverCore = FindServerCore(context.RequestUri, context.LocalPort);
131
131
if (serverCore is null)
132
132
{
133
133
var entryPoint = XFEServerCore.GetRequestSegments(context.RequestUri).FirstOrDefault() ?? "<空>";
@@ -172,8 +172,8 @@ internal sealed class XFEServerCoreHost
172
172
}
173
173
}
174
174
175
private XFEServerCore? FindServerCore(Uri requestUrl) => _serverCores
176
.Where(core => _bindingEndpoints[core].Any(endpoint => endpoint.Matches(requestUrl)))
175
private XFEServerCore? FindServerCore(Uri requestUrl, int localPort) => _serverCores
176
.Where(core => _bindingEndpoints[core].Any(endpoint => endpoint.Matches(requestUrl, localPort)))
177
177
.Select(core => (Core: core, Matches: core.TryGetRoute(requestUrl, out _)))
178
178
.Where(item => item.Matches)
179
179
.OrderByDescending(item => item.Core.MainEntryPointSegmentCount)
@@ -190,21 +190,21 @@ internal sealed class XFEServerCoreHost
190
190
private ValueTask CyberCommServerClientConnectedAsync(CyberCommServerEventArgs e, CancellationToken cancellationToken)
191
191
{
192
192
cancellationToken.ThrowIfCancellationRequested();
193
if (e.RequestUrl is not null) FindServerCore(e.RequestUrl)?.NotifyClientConnected(CyberCommServer, e);
193
if (e.RequestUrl is not null) FindServerCore(e.RequestUrl, e.LocalPort)?.NotifyClientConnected(CyberCommServer, e);
194
194
return ValueTask.CompletedTask;
195
195
}
196
196
197
197
private ValueTask CyberCommServerMessageReceivedAsync(CyberCommServerEventArgs e, CancellationToken cancellationToken)
198
198
{
199
199
cancellationToken.ThrowIfCancellationRequested();
200
if (e.RequestUrl is not null) FindServerCore(e.RequestUrl)?.NotifyMessageReceived(CyberCommServer, e);
200
if (e.RequestUrl is not null) FindServerCore(e.RequestUrl, e.LocalPort)?.NotifyMessageReceived(CyberCommServer, e);
201
201
return ValueTask.CompletedTask;
202
202
}
203
203
204
204
private ValueTask CyberCommServerConnectionClosedAsync(CyberCommServerEventArgs e, CancellationToken cancellationToken)
205
205
{
206
206
cancellationToken.ThrowIfCancellationRequested();
207
if (e.RequestUrl is not null) FindServerCore(e.RequestUrl)?.NotifyConnectionClosed(CyberCommServer, e);
207
if (e.RequestUrl is not null) FindServerCore(e.RequestUrl, e.LocalPort)?.NotifyConnectionClosed(CyberCommServer, e);
208
208
return ValueTask.CompletedTask;
209
209
}
210
210
@@ -229,9 +229,9 @@ internal sealed class XFEServerCoreHost
229
229
return new(uri.Scheme.ToLowerInvariant(), host.ToLowerInvariant(), uri.Port);
230
230
}
231
231
232
public bool Matches(Uri requestUri) =>
232
public bool Matches(Uri requestUri, int localPort) =>
233
233
Scheme.Equals(requestUri.Scheme, StringComparison.OrdinalIgnoreCase) &&
234
Port == requestUri.Port &&
234
Port == localPort &&
235
235
(Host == "*" || Host.Equals(requestUri.IdnHost, StringComparison.OrdinalIgnoreCase));
236
236
237
237
public bool Overlaps(BindingEndpoint other) =>
@@ -7,7 +7,7 @@
7
7
<GenerateDocumentationFile>True</GenerateDocumentationFile>
8
8
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
9
9
<NoWarn>$(NoWarn);CS1591;CS8669</NoWarn>
10
<Version>4.0.0</Version>
10
<Version>4.0.1</Version>
11
11
<Title>XFEExtension.NetCore.ServerInteractive</Title>
12
12
<RepositoryUrl>https://github.com/XFEstudio/XFEExtension.NetCore.ServerInteractive</RepositoryUrl>
13
13
<AnalysisLevel>latest</AnalysisLevel>
@@ -25,6 +25,8 @@
25
25
26
26
4.0 使用自研 CyberComm Socket/TLS/HTTP/1.1/WebSocket 传输层,并提供跨平台可取消生命周期。
27
27
28
核心服务器按实际本地监听端口分发请求,兼容 EdgeOne/CDN 的公开端口与回源端口不同的场景。
29
28
30
## 新增
29
31
30
32
支持多个核心服务器绑定同一端口,并通过不同的 MainEntryPoint 区分;同端口同入口配置会在启动时直接报错。
@@ -61,7 +63,7 @@
61
63
</ItemGroup>
62
64
63
65
<ItemGroup>
64
<PackageReference Include="XFEExtension.NetCore" Version="5.2.0" />
66
<PackageReference Include="XFEExtension.NetCore" Version="5.2.1" />
65
67
<PackageReference Include="XFEExtension.NetCore.AutoConfig" Version="4.1.0" />
66
68
<PackageReference Include="XFEExtension.NetCore.AutoImplement" Version="1.1.0" />
67
69
<PackageReference Include="XFEExtension.NetCore.XFEConsole" Version="2.5.0" />