Устранение неполадок с кэшем нестандартного поставщика ролей - PullRequest
0 голосов
/ 27 сентября 2010

Я написал собственный поставщик ролей, который внутренне использует методы веб-службы для получения ролей или имен пользователей. Этот провайдер наследует от System.Web.Security.RoleProvider . В файле web.config я включил функцию кэширования .NET, которая использует куки.

Вот как выглядит web.config раздел для этого провайдера:

<system.web>      
      <roleManager defaultProvider="MyProvider"
                 enabled="true"
                 cacheRolesInCookie="true"
                 cookieName=".MYROLES"
                 cookieTimeout="30"
                 cookiePath="/"
                 cookieRequireSSL="false"
                 cookieSlidingExpiration="true"
                 cookieProtection="All">
        <providers>
          <clear/>
          <add name="MYProvider"
               type="MYProvider.MyRoleProvider, MYProvider"
               Service1URL="http://localhost:54013/service1.asmx"
               Service2URL="http://localhost:54013/service2.asmx"
               rolesPrefix="ABC_"
               domainName="abc.corp"
               specialUserForAllRoles="abc"
               applicationURL="http://example.com"
               logCommunication="true"/>
        </providers>
      </roleManager>
</system.web>

Теперь нужно проверить, работает кеш или нет. Я написал простой метод, который выглядит так:

public void TestCache()
{
   string[] roles = Roles.GetAllRoles();
   roles = Roles.GetAllRoles();

   string[] rolesForUser1 = Roles.GetRolesForUser("user1");
   rolesForUser1 = Roles.GetRolesForUser("user1");

   string[] usersInRole = Roles.GetUsersInRole("ABC_DEV");
   usersInRole = Roles.GetUsersInRole("ABC_DEV");       

   Roles.IsUserInRole("user1", "ABC_DEV");
   Roles.IsUserInRole("user1", "ABC_DEV");
}

При отладке этого фрагмента кода (с тестового веб-сайта) отладчик вводит каждый из показанных методов в провайдере и выполняет всю логику внутри, несмотря на то, что индукция метода является избыточной или нет. Я думал, что второй вызов каждого метода не должен выполняться, потому что результат будет возвращен без запроса моего провайдера непосредственно из кэша.

Что я делаю / неправильно думаю и как исправить функцию кэширования?

Привет

1 Ответ

1 голос
/ 27 сентября 2010

Кэш ролей работает только для ролей текущего пользователя. Это должно быть в кеше:

var isInRole = User.IsInRole("ABC_DEV")

http://msdn.microsoft.com/en-us/library/ms164660(VS.80).aspx

...