静态 ID - ASP.NET 核心分布式缓存标记帮助程序

Static Id - ASP.NET Core Distributed Cache Tag Helper

我们在 SQL 服务器上使用 ASP.NET Core Distributed Cache Tag Helper。

<distributed-cache name="MyCacheItem1" expires-after="TimeSpan.FromDays(1)">
   <p>Something that will be cached</p>
   @DateTime.Now.ToString()
</distributed-cache>

存储如下。

问题是 Id 列被自动散列。我们希望在 Id 列中有一些有意义的字符串。 可能吗?

The problem is that Id column is automatically hashed.

从源代码中,我们可以发现它似乎是设计使然的行为:

try
{
    var serializedKey = Encoding.UTF8.GetBytes(key.GenerateKey());
    var storageKey = key.GenerateHashedKey();
    var value = await _storage.GetAsync(storageKey);

    //...

    //...

    await _storage.SetAsync(storageKey, encodeValue, options);

we want some meaningful string in Id column. Is it possible?

如果您有特定的 scenario/requirement 需要 Id 列的未哈希数据,您可以参考 DistributedCacheTagHelperDistributedCacheTagHelperService 的源代码,然后实现自定义标记助手。

谢谢@韩飞。我从你的回答中得到了线索。

在 Id 列中存储自定义字符串。按照步骤进行。

  1. 使用 IDistributedCacheTagHelperService 实现自定义 class(我创建的类似 HtmlDistributedCacheTagHelperService)

  2. 在启动时插入此自定义 class。 services.AddScoped();

  3. 复制 DistributedCacheTagHelperService (https://github.com/dotnet/aspnetcore/blob/52eff90fbcfca39b7eb58baad597df6a99a542b0/src/Mvc/Mvc.TagHelpers/src/Cache/DistributedCacheTagHelperService.cs#L102) 的实际源代码。并粘贴到 HtmlDistributedCacheTagHelperService 中。

  4. 我添加了自定义属性 htmlcache-uniqueid。 <分布式缓存名称="UniqueName" htmlcache-uniqueid="CustomStringId">

  5. 在 HtmlDistributedCacheTagHelperService 内部 class 我添加了下面的代码来获取我的自定义属性。

     if (output.Attributes != null && output.Attributes.Count > 0 &&
     string.Equals(output.Attributes[0].Name, "htmlcache-uniqueid") && 
     output.Attributes[0].Value != null)
    {
     storageKey = Convert.ToString(output.Attributes[0].Value);
    }
    
  6. 最后你可以看到存储在数据库中的id,如下所示。