🔌 HTTP 传输
命名空间: Snet.Core.communication.net.http.client / Snet.Core.communication.net.http.service | 类: HttpClientOperate, HttpServiceOperate
注意: HTTP 传输类直接继承
CoreUnify而非CommunicationAbstract。这是因为它遵循请求-响应模式而非流式连接。
HttpClientOperate — HTTP 客户端
继承: CoreUnify<HttpClientOperate, HttpClientData.Basics>
配置 (HttpClientData.Basics)
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
MaxConnectCount |
int |
255 |
每服务器最大连接数 |
请求模型 (RequestData)
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
Url |
string |
"http://127.0.0.1:6688/api/snet" |
请求 URL(必须是绝对 HTTP/HTTPS URI) |
Headers |
ConcurrentDictionary<string,string> |
{} |
自定义请求头(不区分大小写) |
Method |
HttpMethod |
GET |
HTTP 方法 |
BodyType |
BType 枚举 |
Raw |
FormData / Raw / None |
BodyContent |
object? |
null |
Raw: string,FormData: IReadOnlyDictionary<string,string>(Dictionary/ConcurrentDictionary) |
Encoding |
Encoding |
UTF8 |
内容编码 |
ContentType |
string |
"application/json" |
Content-Type |
TimeOut |
TimeSpan |
60s |
请求超时 |
Proxy |
IWebProxy? |
null |
代理 |
CookieContainer |
CookieContainer |
new() |
Cookie 存储 |
响应数据 (ResponseData):StatusCode (int)、ResHeadersDatas (ConcurrentDictionary<string,string>?)、ResCookieData (CookieCollection)、ResData (string?)、ReqData (RequestData)。
API
// 发送请求 — 核心方法(非绝对 HTTP/HTTPS URL 会抛出 ArgumentException)
public async Task<OperateResult> RequestAsync(RequestData requestData, CancellationToken token = default);
// 同步版本
public OperateResult Request(RequestData requestData);
使用示例
using Snet.Core.communication.net.http.client;
using static Snet.Core.communication.net.http.client.HttpClientData;
var http = await HttpClientOperate.InstanceAsync(new Basics());
// GET
var getResp = await http.RequestAsync(new RequestData {
Url = "https://api.example.com/data", Method = HttpMethod.Get
});
// POST JSON
var postResp = await http.RequestAsync(new RequestData {
Url = "https://api.example.com/data", Method = HttpMethod.Post,
BodyType = BType.Raw, BodyContent = "{\"name\":\"value\"}"
});
// POST Form
var formResp = await http.RequestAsync(new RequestData {
Url = "https://api.example.com/upload", Method = HttpMethod.Post,
BodyType = BType.FormData,
BodyContent = new Dictionary<string, string> { ["field1"] = "value1" }
});
HttpServiceOperate — HTTP 服务端
继承: CoreUnify<HttpServiceOperate, HttpServiceData.Basics> | 接口: IOn, IOff, IStatus
配置 (HttpServiceData.Basics,继承 WAModel)
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
ContentType |
string |
"application/json" |
请求与响应内容类型 |
AbsolutePaths |
List<AbsolutePathsModel> |
[new("/api/snet", HttpMethod.Get)] |
有效 API 路由;每个路由(Path + Method)配置各自的请求方式 |
AllowedOrigins |
List<string> |
[] |
允许携带凭据跨域访问的精确来源列表(空 = 不信任任何来源) |
MaxRequestBodyBytes |
int |
1048576 |
单个请求体最大字节数(1 MiB);超限返回 413 |
CrossDomain |
bool |
false |
CORS 支持(来自 WAModel) |
IpAddress |
string |
"127.0.0.1" |
监听地址(来自 WAModel) |
Port |
int |
6688 |
监听端口(来自 WAModel) |
CORS 行为:启用 CrossDomain 时,仅当来源命中 AllowedOrigins 才回显 Access-Control-Allow-Origin(并附带 Access-Control-Allow-Credentials: true);预检 OPTIONS 在来源允许时返回 204,否则返回 403。
API
await server.OnAsync(CancellationToken token = default); // 启动 HttpListener(端口被占用时返回"端口被占用")
await server.OffAsync(bool hardClose = false, CancellationToken token = default); // 停止
await server.GetStatusAsync(CancellationToken token = default);
// 同步包装: On(), Off(), GetStatus()
// 写入 JSON 响应 — 实例方法 + 静态泛型版本
await server.WriteAsync(HttpListenerResponse response, object obj, CancellationToken token = default);
await server.WriteAsync<T>(HttpListenerResponse response, T obj, CancellationToken token = default);
WaitHandler 事件数据
| 字段 | 类型 | 说明 |
|---|---|---|
Request |
HttpListenerRequest |
请求数据 |
Response |
HttpListenerResponse |
响应对象 |
BodyData |
string? |
请求体内容 |
使用示例
using System.Net;
using Snet.Core.communication.net.http.service;
using static Snet.Core.communication.net.http.service.HttpServiceData; // Basics, WaitHandler, AbsolutePathsModel
var config = new Basics {
IpAddress = "0.0.0.0", Port = 8080,
CrossDomain = true,
AbsolutePaths = new List<AbsolutePathsModel> {
new("/api/snet", HttpMethod.Post),
new("/api/health", HttpMethod.Get)
}
};
var server = await HttpServiceOperate.InstanceAsync(config);
server.OnDataEvent += async (s, e) => {
if (e.ResultData is WaitHandler wh) {
Console.WriteLine($"路径: {wh.Request.Url!.AbsolutePath}");
await HttpServiceOperate.WriteAsync(wh.Response, new { status = "ok" });
}
};
await server.OnAsync();
