分类 Net core 下的文章

Net core 6.0 中,要开启 GcServer 模式,需要通过环境变量的方式。

Windows 系统

直接增加环境变量(用户或系统自己看着办)

DOTNET_gcServer=1

在 Linux 中

如果是直接运行的程序,直接 export DOTNET_gcServer=1 就行
要永久生效,可以将这句加入到 ~/.bashrc (当前用户) 和 /etc/profile (全局) 中。

如果是 service 方式运行的话,上面的方式就不生效了,就需要这样做:

systemctl edit <service>

写入以下内容:

[Service]
Environment="DOTNET_gcServer=1"

建类:ViewBagActionFilter

namespace MetaWeb.Core
{
    public class ViewBagActionFilter : ActionFilterAttribute
    {

        public ViewBagActionFilter()
        {
            //DI will inject what you need here
        }

        public override void OnResultExecuting(ResultExecutingContext context)
        {
            // for razor pages
            if (context.Controller is PageModel)
            {
                var controller = context.Controller as PageModel;
                controller?.ViewData.Add("Langs", Langs.instance());
                //also you have access to the httpcontext & route in controller.HttpContext & controller.RouteData
            }

            // for Razor Views
            if (context.Controller is Controller)
            {
                var controller = context.Controller as Controller;
                if(controller != null)
                    controller.ViewBag.Langs = Langs.instance();
            }

            base.OnResultExecuting(context);
        }
    }
}

Program.cs 中添加:

builder.Services.AddControllersWithViews(options => {
    options.Filters.Add<ViewBagActionFilter>();
});

新建处理类:

public class SlugifyParameterTransformer : IOutboundParameterTransformer
{
    public string? TransformOutbound(object? value)
    {
        if(value == null) return null;
        string? result = value.ToString();
        if(result == null) return null;

        return Regex.Replace(result, "([a-z])([A-Z])", "$1-$2").ToLower();
    }
}

路由注入 Program.cs :

builder.Services.AddRouting(options => {
    options.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer);
    options.LowercaseUrls = true;
});

路由:

app.MapControllerRoute(name: "default", pattern: "{controller:slugify=Home}/{action:slugify=Index}/{id?}");

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(o =>
    {
        o.LoginPath = "/user/login";
    });

app.UseRouting();
app.UseAuthentication();    //增加登录验证,注意顺序
app.UseAuthorization();

登录验证成功后:

var claims = new List<Claim>()
{
    new Claim(ClaimTypes.Name, userInfo.Nickname),
    new Claim(ClaimTypes.NameIdentifier, userInfo.ID.ToString()),
    new Claim("Phone", userInfo.Phone)
};
var claimnsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);

//它会自动发送token给客户端。并生成cookies
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimnsIdentity), 
    new AuthenticationProperties
    {
        IsPersistent = true
    });

验证:

context.HttpContext.User.Identity.IsAuthenticated

取值:

string? Nickname = context.HttpContext.User.Identity.Name
string? uid = context.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier)?.Value
string phone = context.HttpContext.User.FindFirst("Phone")?.Value ?? "18011112222";