2016-04-14 2 views
1

Я не выношу ActionDescriptor.UniqueId. Является ли это уникальным, как тип приложения (но cnstant с течением времени), или каждый запрос получает новый уникальный идентификатор?ASP.NET MVC: ActionDescriptor.UniqueId как уникально?

Могу ли я использовать его для разграничения между несколькими вызовами одного и того же метода контроллера, например, разными пользователями?

Много приветствий!

Volker

ответ

2

Я не имел опыта с UniqueId собственности, так что я сделал несколько исследований с использованием источника MVC (который является, где вы всегда должны начать на вопрос, как это).

ActionDescriptor

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

ActionDescriptor's уникальный идентификатор содержит свой ControllerDescriptor's уникальный идентификатор, а также.

ControllerDescriptor

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

DescriptorUtil (внутренний класс)

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(); 
} 

Вы можете видеть, что значение создается из информации о типе и информации контроллер/действие. Он должен быть уникальным среди всех других действий в приложении. Не кажется, что параметры (если они есть), принятые действием, влияют на идентификатор.

Могу ли я использовать его для разграничения между несколькими вызовами от того же метода , как у разных пользователей?

Информация о пользователе не указана в генерируемом идентификаторе.

OutputCacheAttribute является потребителем UniqueId. Это указывает на то, что значение - хотя и уникальное для разных действий - предсказуемо между вызовами. В противном случае это было бы бесполезно для кеширования.

+1

Спасибо большое! Таким образом, для отслеживания звонков я вставляю фильтр, который добавляет Guid.NewGuid() в HttpContext. – Volker

Смежные вопросы