角色提供者的值不能为空
Value can not be null on Role Provider
我是 MVC C# 的初学者。现在我正在尝试使用角色提供程序构建自定义身份验证,但是当它检查用户角色时收到 "Value can not be null" 错误。
这是我的 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);
(值不能为 null(用户名))行上出错。我使用了调试指针,它显示网关从未 invoked.I,e: 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;
}
我的代码有问题吗?我该如何解决这个错误?
it works if I delete or comment out httpContext and all code for
cache...Is there Anything wrong with cache portion code?? @Win
我不会担心访问数据库,除非您正在开发企业应用程序,其中速度是一个问题并且每个查询都很重要。 原来的ASP.Net Membership Provider 根本不使用缓存。
此外,ASP.Net Membership Provider 是一项非常古老的技术 - 已有十多年历史。如果您正在为企业应用程序实施,您可能需要考虑使用基于声明的身份验证。
这里是缓存服务,如果你想使用 -
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);
}
}
我是 MVC C# 的初学者。现在我正在尝试使用角色提供程序构建自定义身份验证,但是当它检查用户角色时收到 "Value can not be null" 错误。
这是我的 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);
(值不能为 null(用户名))行上出错。我使用了调试指针,它显示网关从未 invoked.I,e: 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;
}
我的代码有问题吗?我该如何解决这个错误?
it works if I delete or comment out httpContext and all code for cache...Is there Anything wrong with cache portion code?? @Win
我不会担心访问数据库,除非您正在开发企业应用程序,其中速度是一个问题并且每个查询都很重要。 原来的ASP.Net Membership Provider 根本不使用缓存。
此外,ASP.Net Membership Provider 是一项非常古老的技术 - 已有十多年历史。如果您正在为企业应用程序实施,您可能需要考虑使用基于声明的身份验证。
这里是缓存服务,如果你想使用 -
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);
}
}