Значение не может быть нулевым в роли поставщика
Я новичок в 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);
}
}