api - 在 ServiceStack 中我可以选择哪些选项来为每个请求分配唯一的 ID?

标签 api logging servicestack trace api-design

我正在使用 ServiceStack 构建 API 。我希望每个请求都有一个唯一的 ID,以便我可以通过系统(分布式)跟踪它。

我的合约程序集包含我的 API 的 DTO,因此我认为自然的地方是让每个 Request 派生自一个基类,该基类具有分配了新 ID 的密封 protected 无参数构造函数(也许 GUID 就可以了)。

但是,可以通过客户端使用我的 API,而不必使用合约 DTO 程序集 - 裸露,如果您愿意的话。此时,客户可以分配他们喜欢的任何 ID(因为该属性将是一个可容纳的字符串,并且我希望 ID 分配能够快速)。

因此,这让我认为服务应该在请求到达系统时分配请求 ID。所以 - 我目前认为最好的办法是在每个请求 DTO 上都有一个 ID 属性,该属性被 API 验证为空 - 客户端无法设置它。然后,一个 before-everything 过滤器为 DTO 属性分配一个值。

这样合理吗?

是否有更优雅的方法来做到这一点(仍然适用于裸客户端?)?

最佳答案

使用全局请求过滤器可以,你可以这样做:

public class IRequiresUniqueId
{
    public Guid UniqueId { get; set; }
}

然后通过实现上述接口(interface)来标记您希望拥有唯一 ID 的所有请求 DTO:

public MyRequest : IRequiresUniqueId
{
    public Guid UniqueId { get; set; }
}

然后您可以使用全局请求过滤器来设置拥有它们的所有请求 DTO:

this.RequestFilters.Add((httpReq, httpResp, requestDto) =>
{
     var requiresUniqueId = requestDto as IRequiresUniqueId;
     requiresUniqueId.UniqueId = Guid.NewGuid();
});

关于api - 在 ServiceStack 中我可以选择哪些选项来为每个请求分配唯一的 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17485016/

相关文章:

javascript - 从API获取数据并在快速 View 中输出

python - 嵌入式 Python - 时间模块中的阻塞操作

javascript - 如何在 JavaScript 中同步 API 响应?

java - 将rabbitMQ消息日志分离到不同的日志文件中

c# - ServiceStack Razor 默认页面

soap - 如何使用servicestack产品,以便将Flutter或Dart连接到soap WSDL服务?

c++ - 静态分析 API?

python - 如何对 Azure 日志提取 API 进行故障排除

python-3.x - 在每个日志语句中添加一个字符串

ServiceStack 和并发