Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Identity Server 4中,缓存似乎不起作用_C#_.net Core_Identityserver4 - Fatal编程技术网

C# 在Identity Server 4中,缓存似乎不起作用

C# 在Identity Server 4中,缓存似乎不起作用,c#,.net-core,identityserver4,C#,.net Core,Identityserver4,我正试图使用他们的方法将缓存添加到我们的IS4实现中。但是,我的实现似乎并没有对登录速度或每次登录时命中数据库的查询数产生任何影响(我希望缓存可以同时减少这两个方面) 我对实现缓存所做的更改如下: 将以下内容添加到Startup.cs ConfigureServices 更新了services.addIdentiyServer()调用以包括以下行: .AddInMemoryCaching() .AddClientStoreCache<IClientStore>() .AddResou

我正试图使用他们的方法将缓存添加到我们的IS4实现中。但是,我的实现似乎并没有对登录速度或每次登录时命中数据库的查询数产生任何影响(我希望缓存可以同时减少这两个方面)

我对实现缓存所做的更改如下:

将以下内容添加到Startup.cs ConfigureServices

更新了services.addIdentiyServer()调用以包括以下行:

.AddInMemoryCaching()
.AddClientStoreCache<IClientStore>()
.AddResourceStoreCache<IResourceStore>()
.AddCorsPolicyCache<ICorsPolicyService>();
.AddInMemoryCaching()
.AddClientStoreCache()
.AddResourceStoreCache()
.AddCorsPolicyCache();
已更新ConfigureServices,使其还具有以下功能:

services.AddScoped<ICorsPolicyService, DefaultCorsPolicyService>();
services.AddScoped<IClientStore, ClientStore>();
services.AddScoped<IResourceStore, ResourceStore>();
services.addScope();
services.addScope();
services.addScope();

这似乎是我唯一需要实现的事情,而当应用程序正常运行时,缓存似乎什么都没有做。我缺少什么?

没有标准的方法来缓存用户

它只缓存:

  • 客户端-AddClientStoreCache
  • 资源-AddResourceStoreCache
  • CorsPolicy-AddCorsPolicyCache

  • 您可以从

    获得更多详细信息。没有标准的方法来缓存用户

    它只缓存:

  • 客户端-AddClientStoreCache
  • 资源-AddResourceStoreCache
  • CorsPolicy-AddCorsPolicyCache

  • 您可以从

    获得更多详细信息基本上您需要做两件事:

    首先实施
    IClientStore

    public class ClientStore : IClientStore
    {
        private readonly IClientService clientService;
    
        public ClientStore(IClientService clientService)
        {
            this.clientService = clientService;
        }
    
        public Task<Client> FindClientByIdAsync(string clientId)
        {
            var client = this.clientService.GetById(clientId);
            return Task.FromResult(client);
        }
    }
    
    这适用于
    客户端缓存
    ,但对于
    Cors
    ResourceStore
    则完全相同

    我认为您缺少了
    选项.Caching.ClientStoreExpiration
    部分。从那里开始

    希望这有帮助


    PS:忘了提及-您不需要显式地注入
    IClientStore
    的实现。通过将其添加到
    .AddClientStoreCache()
    中,它将被注入。但是(如我的示例中所示),如果您有商店使用的其他服务,则需要注入它们。

    基本上,您需要做两件事:

    首先实施
    IClientStore

    public class ClientStore : IClientStore
    {
        private readonly IClientService clientService;
    
        public ClientStore(IClientService clientService)
        {
            this.clientService = clientService;
        }
    
        public Task<Client> FindClientByIdAsync(string clientId)
        {
            var client = this.clientService.GetById(clientId);
            return Task.FromResult(client);
        }
    }
    
    这适用于
    客户端缓存
    ,但对于
    Cors
    ResourceStore
    则完全相同

    我认为您缺少了
    选项.Caching.ClientStoreExpiration
    部分。从那里开始

    希望这有帮助



    PS:忘了提及-您不需要显式地注入
    IClientStore
    的实现。通过将其添加到
    .AddClientStoreCache()
    中,它将被注入。但是(如我的示例中所示),如果您有商店使用的其他服务,则需要注入它们。

    文档相当有限。@MarshallTigerus您需要的一切都以简短而有用的形式提供。如果这还不够的话,请看一看我所做的事情的来源和例子,这就是我是如何做到这一点的。我试图找到一个使用缓存与我实现的内容进行比较的官方示例。@MarshallTigerus据我所知,没有官方方法缓存用户。所讨论的调用都是围绕客户端的db查询,所以clientstore应该缓存它们文档相当有限。@MarshallTigerus您需要的一切都以简短而有用的形式提供。如果这还不够的话,请看一看我所做的事情的来源和例子,这就是我是如何做到这一点的。我正试图找到一个官方示例,它使用缓存来与我实现的内容进行比较。@据我所知,没有官方的方法来缓存用户。所讨论的调用都是围绕客户端的db查询,所以clientstore应该在缓存它们。我还没能使这项功能正常工作。我正确地从上下文中检索客户机,但是当我使用ToModel()时,它只返回名称,而不是客户机模型。我得到了一个有效的版本,它似乎提高了速度。我猜您是对的,过期可能是它的主要原因。您可以在调试时检查它是否工作-连接您自己,并从一个客户端登录。您将在第一次登录时看到,转到findclientbydasync方法。然后在调试过程中再次尝试登录到同一客户机,但过期时间尚未过去(例如使用incognito会话)。您将看到FindClientByDaSync在接下来的“X”分钟内(即您的过期时间)不会再次被点击。我很高兴它对您有效。日志记录已经证实,它进行的数据库调用比以前少得多。我还没有能够使它正常工作。我正确地从上下文中检索客户机,但是当我使用ToModel()时,它只返回名称,而不是客户机模型。我得到了一个有效的版本,它似乎提高了速度。我猜您是对的,过期可能是它的主要原因。您可以在调试时检查它是否工作-连接您自己,并从一个客户端登录。您将在第一次登录时看到,转到findclientbydasync方法。然后在调试过程中再次尝试登录到同一客户机,但过期时间尚未过去(例如使用incognito会话)。您将看到FindClientByDaSync在接下来的“X”分钟内(即您的过期时间)不会再次被点击。我很高兴它能为您所用。日志记录已经证实,它进行的数据库调用比以前少得多。