ServiceStack中有哪些选项可以为每个请求分配唯一的ID?

时间:2013-07-05 09:02:27

标签: api logging servicestack tracing api-design

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

我的合同汇编包含我的API的DTO,所以我认为自然的地方是让每个Request派生自一个具有密封的受保护无参数构造函数的基类,该基类分配了一个新的ID(可能是GUID很好)。

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

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

这是明智的吗?

是否有一种更优雅的方式(这仍然适用于裸体客户?)?

1 个答案:

答案 0 :(得分:2)

使用全局请求过滤器可以使用,您可以执行以下操作:

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

然后通过实现上述界面标记您希望拥有唯一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();
});
相关问题