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中没有用户信息。
OutputCacheAttribute
是 UniqueId
的消费者。这强烈表明该值(虽然在操作中是唯一的)在调用之间是可预测的。否则,它将无法用于缓存目的。
我不明白 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中没有用户信息。
OutputCacheAttribute
是 UniqueId
的消费者。这强烈表明该值(虽然在操作中是唯一的)在调用之间是可预测的。否则,它将无法用于缓存目的。