我正在使用 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/