Значение не может быть нулевым в роли поставщика

Я новичок в MVC C#. Сейчас я пытаюсь создать пользовательскую аутентификацию с поставщиком ролей, но при проверке роли пользователя появляется сообщение об ошибке "Значение не может быть нулевым". Вот мой RoleProvider:

public class MyRoleProvider:RoleProvider
{
    private int _cacheTimeoutInMinute = 20;
    LoginGateway gateway=new LoginGateway();


public override string[] GetRolesForUser(string username)
    {
        if (!HttpContext.Current.User.Identity.IsAuthenticated)
        {
            return null;
        }

        //check cache
        var cacheKey = string.Format("{0}_role", username);
        if (HttpRuntime.Cache[cacheKey] != null)
        {
            return (string[])HttpRuntime.Cache[cacheKey];
        }
        string[] roles

            = gateway.GetUserRole(username).ToArray();
            if (roles.Any())
            {
                HttpRuntime.Cache.Insert(cacheKey, roles, null, DateTime.Now.AddMinutes(_cacheTimeoutInMinute), Cache.NoSlidingExpiration);

            }

        return roles;
    }
public override bool IsUserInRole(string username, string roleName)
    {
        var userRoles = GetRolesForUser(username);
            return userRoles.Contains(roleName);   

    }

Всегда получаю ошибку на reurn userRoles.Contains(roleName); (значение не может быть нулевой (userName)). Я использовал указатель отладки, он показывает, что шлюз никогда не вызывался. string[] roles = gateway.GetUserRole(username).ToArray(); поэтому роли всегда остаются нулевыми. Хотя я не уверен, что мой метод GetUserRole на шлюзе правильный или нет: вот мой шлюз:

public string[] GetUserRole(string userName)
    {

        string role = null;
        SqlConnection connection = new SqlConnection(connectionString);
        string query = "select r.RoleType from RoleTable r join UserRoleTable ur on ur.RoleId=r.Id join UserTable u on u.UserId=ur.UserId where u.UserName='"+userName+"'";
        SqlCommand command = new SqlCommand(query, connection);
        connection.Open();
        SqlDataReader reader = command.ExecuteReader();
        while (reader.Read())
        {
            role = reader["RoleType"].ToString();

        }
        string[] roles = {role};
        reader.Close();
        connection.Close();
        return roles;
    }  

Есть ли проблемы с моим кодом? и как я мог решить эту ошибку?

1 ответ

Решение

это работает, если я удаляю или закомментирую httpContext и весь код для кэша... Что-то не так с кодом части кэша?? @Выиграть

Я не буду беспокоиться о попадании в базу данных, если вы не разрабатываете корпоративное приложение, скорость которого является проблемой, и каждый запрос учитывается. Оригинальный поставщик членства ASP.Net вообще не использует кэш.

Кроме того, поставщик членства ASP.Net - это очень старая технология, которой более десяти лет. Если вы внедряете приложение Enterprise, вы можете рассмотреть возможность использования аутентификации на основе утверждений.

Вот служба кэширования, если вы хотите использовать -

using System;
using System.Collections.Generic;
using System.Runtime.Caching;

public class CacheService 
{
    protected ObjectCache Cache => MemoryCache.Default;

    public T Get<T>(string key)
    {
        return (T) Cache[key];
    }

    public void Set(string key, object data, int cacheTime)
    {
        if (data == null)
            return;

        var policy = new CacheItemPolicy();
        policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(cacheTime);
        Cache.Add(new CacheItem(key, data), policy);
    }

    public void Remove(string key)
    {
        Cache.Remove(key);
    }
}
Другие вопросы по тегам