ASP.NET MVC:ActionDescriptor.UniqueId 有多独特?

ASP.NET MVC: ActionDescriptor.UniqueId how unique?

我不明白 ActionDescriptor.UniqueId。这是像应用程序中的类型一样唯一(但随着时间的推移保持不变),还是每个请求都会获得一个新的唯一 ID?

我可以使用它来区分不同用户对同一控制器方法的多次调用吗?

多多问候!

沃尔克

我没有使用 UniqueId 属性 的经验,所以我使用 MVC 源代码做了一些研究(对于这样的问题,您应该始终从这里开始)。

ActionDescriptor

private string CreateUniqueId()
{
    return DescriptorUtil.CreateUniqueId(GetType(), ControllerDescriptor, ActionName);
}

ActionDescriptor's 唯一 ID 也包含其 ControllerDescriptor's 唯一 ID。

控制器描述符

private string CreateUniqueId()
{
    return DescriptorUtil.CreateUniqueId(GetType(), ControllerName, ControllerType);
}

DescriptorUtil(内部class)

public static string CreateUniqueId(IEnumerable<object> parts)
{
    // returns a unique string made up of the pieces passed in
    StringBuilder builder = new StringBuilder();
    foreach (object part in parts)
    {
        // We can special-case certain part types

        MemberInfo memberInfo = part as MemberInfo;
        if (memberInfo != null)
        {
            AppendPartToUniqueIdBuilder(builder, memberInfo.Module.ModuleVersionId);
            AppendPartToUniqueIdBuilder(builder, memberInfo.MetadataToken);
            continue;
        }

        IUniquelyIdentifiable uniquelyIdentifiable = part as IUniquelyIdentifiable;
        if (uniquelyIdentifiable != null)
        {
            AppendPartToUniqueIdBuilder(builder, uniquelyIdentifiable.UniqueId);
            continue;
        }

        AppendPartToUniqueIdBuilder(builder, part);
    }

    return builder.ToString();
}

您可以看到该值是根据类型信息和 controller/action 信息创建的。它在应用程序中的所有其他操作中应该是唯一的。操作接受的参数(如果有)似乎不会影响 ID。

Can I use it to differentiate between several calls ot the same controller method, like by different users?

生成的ID中没有用户信息。

OutputCacheAttributeUniqueId 的消费者。这强烈表明该值(虽然在操作中是唯一的)在调用之间是可预测的。否则,它将无法用于缓存目的。