2016-04-14 3 views
1

私はActionDescriptor.UniqueIdを理解していません。これはアプリケーション内の型のようにユニークですか(ただし時間の経過とともに)か、すべての要求は新しい一意のIDを取得しますか?ASP.NET MVC:ActionDescriptor.UniqueIdはどのようにユニークですか?

異なるユーザーのように、同じコントローラメソッドで複数の呼び出しを区別するために使用できますか?

挨拶がたくさん!

フォルカー

答えて

2

私はUniqueId財産と経験がなかったので、私は(あなたは、常にこのような質問のために開始すべきところです)MVCのソースを使用した研究のビットをしました。

ActionDescriptor

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

ActionDescriptor'sユニークIDは、同様にそのControllerDescriptor'sユニークなIDが含まれています。

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

あなたは値をタイプ情報及びコントローラ/アクション情報から作成されていることを見ることができます。アプリケーション内の他のすべてのアクションで一意でなければなりません。アクションによって受け入れられたパラメータ(存在する場合)は、IDに影響を与えることはありません。

異なるユーザーのように、同じ コントローラメソッドの複数のコールを区別するために使用できますか?

生成されたIDにユーザー情報が含まれていません。

OutputCacheAttributeは、UniqueIdの消費者です。これは、値が - 複数のアクション間でユニークであるが - コール間で予測可能であることを強く示します。さもなければ、それはキャッシング目的のために役に立たないでしょう。

+1

ありがとうございました!そこで、コールトラッキングでは、Guid.NewGuid()をHttpContextに追加するフィルタを挿入します。 – Volker

関連する問題