2021年12月8日 星期三

asp.net 網站無法同時處理多個請求

此為 session block 造成的,當 iis 執行一個請求時,若用到session,會把session lock,下一個請求會等待unlock 後才能存取session,之後才會執行後續程式

請關閉session,若有用到session 則改用其他方式做資料交換,例如用memorycache 記錄使用者權限

web.config
<system.web>
<sessionState mode="Off" />

public class 權限設定 {
class 使用者權限
{
public int userid { get; set; }
public string functionid { get; set; }
}
static ObjectCache cache = MemoryCache.Default;
static List<使用者權限> 使用者權限cache
{
get
{
if (cache["使用者權限"] == null) cache["使用者權限"] = new List<使用者權限>();
return cache["使用者權限"] as List<使用者權限>;
}
set
{
CacheItemPolicy policy = new CacheItemPolicy();
policy.AbsoluteExpiration = DateTimeOffset.Now.AddDays(1);
cache.Add("使用者權限", value, policy);
}
}
public static bool 檢查權限(string ID, System.Web.UI.Page page)
{
var userid = page.User.Identity.Name.ToInt();
if (!使用者權限cache.Any(a=>a.userid==userid))
{
using (var db = new xxxEntities())
{
使用者權限cache.AddRange(db.xxx.Where(a=>a.UserID==userid).Select(a =>new 使用者權限() { userid = a.UserID, functionid = a.FunctionID }).ToList());
}
}
return 使用者權限cache.Any(a => a.userid == userid && a.functionid == ID);
}
public static void 清除使用者權限cache(Page page)
{
var userid = page.User.Identity.Name.ToInt();
使用者權限cache.RemoveAll(a => a.userid == userid);
}
}

沒有留言:

自訂權限驗證機制

// 使用 filter [Route("api/[controller]")] [ApiController] [Authorize] [TypeFilter(typeof(CustomAsyncAuthorizationFilter))] public c...