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

Posted

技术标签:

【中文标题】静态 ID - ASP.NET Core 分布式缓存标记帮助程序【英文标题】:Static Id - ASP.NET Core Distributed Cache Tag Helper 【发布时间】:2021-07-19 18:42:41 【问题描述】:

我们将 ASP.NET Core 分布式缓存标记助手与 SQL 服务器一起使用。

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

它存储如下。

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

【问题讨论】:

【参考方案1】:

问题是 Id 列是自动散列的。

从源代码中,我们可以发现这似乎是一种设计行为:

try

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

    //...

    //...

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

https://github.com/dotnet/aspnetcore/blob/52eff90fbcfca39b7eb58baad597df6a99a542b0/src/Mvc/Mvc.TagHelpers/src/DistributedCacheTagHelper.cs#L72

https://github.com/dotnet/aspnetcore/blob/52eff90fbcfca39b7eb58baad597df6a99a542b0/src/Mvc/Mvc.TagHelpers/src/Cache/DistributedCacheTagHelperService.cs#L102

我们希望在 Id 列中有一些有意义的字符串。有可能吗?

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

【讨论】:

【参考方案2】:

谢谢@Fei Han。我从你的回答中得到了线索。

将自定义字符串存储在 Id 列中。按照步骤操作。

    使用 IDistributedCacheTagHelperService 实现自定义类(我创建的类似 htmlDistributedCacheTagHelperService)

    在启动时注入这个自定义类。 services.AddScoped();

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

    我添加了自定义属性 htmlcache-uniqueid。 htmlcache-uniqueid="CustomStringId">

    在 HtmlDistributedCacheTagHelperService 类中,我在代码下方添加了我的自定义属性。

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

    最后,您可以看到存储在 db 中的 id,如下所示。

【讨论】:

以上是关于静态 ID - ASP.NET Core 分布式缓存标记帮助程序的主要内容,如果未能解决你的问题,请参考以下文章

利用 ASP.NET Core 中的标头传播实现分布式链路跟踪

利用 ASP.NET Core 中的标头传播实现分布式链路跟踪

利用 ASP.NET Core 中的标头传播实现分布式链路跟踪

Asp.Net Core 中的静态文件

如何在 asp.net core 中遍历 MemoryCache?

asp.net core 系列之静态文件