- 新增 IApiResponse 统一响应契约,覆盖普通响应和分页响应
- 扩展端点映射,支持 IApiResponse 和带请求 DTO 的 MapXxx 重载
- 增加 Body、Query、Route Values 到请求 DTO 的自动绑定
- 增加 PC 端路由模式匹配,支持 {id} 和 {id:int}
- API 与 PC 端点上下文补充路由参数传递
- 调整 OpenAPI 请求类型处理,避免 GET/DELETE 被标记为 JSON Body
- 鉴权端点迁移到强类型请求绑定和 IApiResponse 返回
- 增加统一端点文件流响应支持
85 lines
2.5 KiB
C#
85 lines
2.5 KiB
C#
using System.Collections.Generic;
|
||
|
||
namespace Avalonia_Services.Core
|
||
{
|
||
/// <summary>
|
||
/// 抽象的请求上下文,屏蔽不同宿主(ASP.NET Core / Desktop WebView)的差异。
|
||
/// </summary>
|
||
public class ServiceEndpointContext
|
||
{
|
||
/// <summary>
|
||
/// 请求路径,例如 "api/wData"
|
||
/// </summary>
|
||
public string Path { get; init; } = string.Empty;
|
||
|
||
/// <summary>
|
||
/// HTTP 方法(GET, POST, PUT, DELETE 等)
|
||
/// </summary>
|
||
public string Method { get; init; } = "GET";
|
||
|
||
/// <summary>
|
||
/// 请求头
|
||
/// </summary>
|
||
public Dictionary<string, string> Headers { get; init; } = new(StringComparer.OrdinalIgnoreCase);
|
||
|
||
/// <summary>
|
||
/// 请求体(原始字符串)
|
||
/// </summary>
|
||
public string? Body { get; set; }
|
||
|
||
/// <summary>
|
||
/// 查询参数
|
||
/// </summary>
|
||
public Dictionary<string, string> Query { get; init; } = new(StringComparer.OrdinalIgnoreCase);
|
||
|
||
/// <summary>
|
||
/// 路由路径参数。
|
||
/// </summary>
|
||
public Dictionary<string, string> RouteValues { get; init; } = new(StringComparer.OrdinalIgnoreCase);
|
||
|
||
/// <summary>
|
||
/// 响应状态码
|
||
/// </summary>
|
||
public int StatusCode { get; set; } = 200;
|
||
|
||
/// <summary>
|
||
/// 响应状态描述
|
||
/// </summary>
|
||
public string StatusMessage { get; set; } = "OK";
|
||
|
||
/// <summary>
|
||
/// 响应头
|
||
/// </summary>
|
||
public Dictionary<string, string> ResponseHeaders { get; set; } = new(StringComparer.OrdinalIgnoreCase)
|
||
{
|
||
["Content-Type"] = "application/json; charset=utf-8"
|
||
};
|
||
|
||
/// <summary>
|
||
/// 响应体
|
||
/// </summary>
|
||
public object? ResponseBody { get; set; }
|
||
|
||
/// <summary>
|
||
/// 存储在请求生命周期中的任意数据(由中间件/过滤器使用)
|
||
/// </summary>
|
||
public Dictionary<string, object?> Items { get; init; } = new();
|
||
|
||
/// <summary>
|
||
/// 获取请求头值
|
||
/// </summary>
|
||
public string? GetHeader(string key)
|
||
{
|
||
return Headers.TryGetValue(key, out var value) ? value : null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 设置响应头
|
||
/// </summary>
|
||
public void SetResponseHeader(string key, string value)
|
||
{
|
||
ResponseHeaders[key] = value;
|
||
}
|
||
}
|
||
}
|