您现在的位置是:网站首页> .NET Core
.NET Core服务端学习笔记
- .NET Core
- 2023-03-19
- 1132人已阅读
.NET Core服务端学习笔记
Maui Blazor windows程序无法通过双击 bin 文件夹中的 exe打开程序的解决办法
在ASP.NET Core中使用Redis作为Session
Net Core 2022视频教程
.net6的obj->(Debug,Release)下的xx.GlobalUsings.g.cs引入全局空间避免每个cs文件都需要重复引用,该代码为编译时自动生成,代码如下
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;
你也可以自己建立个GlobalspaceName.cs,将全局的放入如
global using Test;
$格式化字符串
string name="xn";
int age=1;
$"第一个变量{name},第二个变量{age}"
=>这是.net3.5新出的lambda表达式,表示一个匿名函数,=>左边是参数,右边是函数体
delegate int Method(int a, int b);
Method m += (a ,b) => a + b;
Console.WriteLine(m(2, 3));
C# Action和Func的用法详解
委托是一个类,定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。
把一个 参数类型 返回值 相同 方法名不同 的方法当变量 的方法 叫委托。
为了实现程序的六大设计中的开闭原则:解耦,对修改关闭,对扩展开放。逻辑分离。
直接调用函数和使用委托调用函数的区别就是是否方便对外扩展。
当我们窗体传值、线程启动时绑定方法、lambda表达式、异步等等情况下需要用到。
事件是一种特殊的委托,本质就是委托,事件是回调机制的一种应用
当委托调用的函数达到某种条件时,可以通过回调通知调用者。
1. delegate 至少0个参数,至多32个参数,可以无返回值,可以指定返回值类型
private delegate int MethodDelegate(int x,int y); //两个参数,返回int类型
static void Main(string[] args)
{
MethodDelegate method = new MethodDelegate(Add);
int result = method(10,20);
}
private static int Add(int x, int y)
{
return x +y;
}
平时用委托的一般方式,先声明委托,然后再去使用,有点麻烦,.net中有已经定义好的委托类型Action 和 Func,可以拿来直接用。
2. Action 至少0个参数,至多16个参数,没有返回值的泛型委托
static void Main(string[] args)
{
Action<string> BookAction = new Action<string>(Book); //一个参数
BookAction("百年孤独");
}
public static void Book(string BookName)
{
Console.WriteLine("我是买书的是:{0}",BookName);
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ActionDemo : MonoBehaviour
{
Action action;//表示无参
Action<int> action1;//表示有传入参数int
void Start()
{
action = actionH1;//没有参数
action();
action1 = actionH2;//一个 int参数
action1(456);
actionH3(() => { Debug.Log("执行完actionH3了"); });//lambda 表达式 来执行委托
actionH3(actionH4);//执行完 actionH3后回调 actionH4方法
}
private void actionH1()//没有参数
{
Debug.Log(123);
}
private void actionH2(int index)//参数int
{
Debug.Log(index);
}
private void actionH3(Action act)//参数 Action
{
Debug.Log("在执行actionH3");
act();//回调 这个 委托方法
}
private void actionH4()//执行完 actionH3后的回调执行
{
Debug.Log("执行完actionH3了");
}
}
3. Func 至少0个参数,至多16个参数,必须有返回值的泛型委托
没有参数只有返回值的方法
static void Main(string[] args)
{
Func<string> RetBook = new Func<string>(FuncBook); //无参的Func 返回一个string
//Func<string> RetBook = FuncBook; //也可以直接这样
Console.WriteLine(RetBook); //执行 这个委托
}
public static string FuncBook()
{
return "送书来了";
}
有参数有返回值的方法
static void Main(string[] args)
{
Func<string, string> RetBook = new Func<string, string>(FuncBook); //有一个参数的Func,返回一个string
//Func<string,string> RetBook = FuncBook; //也可以直接这样
Console.WriteLine(RetBook("aaa")); //执行 这个委托
}
public static string FuncBook(string BookName)
{
return BookName;
}
Func一个很重要的用处就是传递值,下面举一个简单的代码来说明
Func<string> funcValue = delegate
{
return "我是即将传递的值3";
};
DisPlayValue(funcValue);
注释1:DisplayVaue是处理传来的值,比喻缓存的处理,或者统一添加数据库等
private static void DisPlayValue(Func<string> func)
{
string RetFunc = func();
Console.WriteLine("我在测试一下传过来值:{0}",RetFunc);
}
完整示列如下:
public class Person
{
public string Name { set; get; }
public int Age { set; get; }
public bool Gender { set; get; }
/// <summary>
/// 重写tostring方法,方便输出结果
/// </summary>
/// <returns></returns>
public override string ToString()
{
return Name + "\t" + Age + "\t" + Gender;
}
}
class Program
{
static void Main(string[] args)
{
Func<Person, Person> funcUpdateAge = new Func<Person, Person>(UpdateAge);
Func<Person, Person> funcUpdateAge2 = UpdateAge;
Func<Person, Person> funcUpdateGender = (p1) => { p1.Gender = false; return p1; };//lambda表达式方式
Func<Person, Person> funUpdateName = delegate(Person p2)//匿名方法
{
p2.Name = "Wolfy2";
return p2;
};
Person p = new Person() { Name = "Wolfy", Age = 24, Gender = true };
Person result = funcUpdateAge(p);
Person result2 = funcUpdateAge2(p);
Console.WriteLine(result.ToString());
Console.WriteLine(result2.ToString());
Console.WriteLine(funcUpdateGender(p).ToString());
Console.WriteLine(funUpdateName(p).ToString());
Console.Read();
}
static Person UpdateAge(Person p)
{
p.Age = 25;
return p;
}
}
记住无返回值就用Action,有返回值就用Func
Action:无参数无返回值委托。
Action<T>:泛型委托,无返回值,根据输入参数的个数不同有十六个重载。
Func<out T>:无输入参数,有返回值。
Func<in T,out T>:有输入参数,有返回值,根据输入参数个数不同,有十六个重载。
Action和Func中可以使用Lambda和匿名方法处理方法体内逻辑。
Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如在反射中使用就可以弥补反射所损失的性能。
Action<T>和Func<T,TResult>的功能是一样的,只是Action<T>没有返类型,
Func<T,T,Result>:有参数,有返回类型
Action,则既没有返回也没有参数,
Func<T,TResult>
的表现形式分为以下几种:
1。Func<T,TResult>
2。Func<T,T1,TResult>
3。Func<T,T1,T2,TResult>
4。Func<T,T1,T2,T3,TResult>
5。Func<T,T1,T2,T3,T4,TResult>
分别说一下各个参数的意义,TResult表示
委托所返回值 所代表的类型, T,T1,T2,T3,T4表示委托所调用的方法的参数类型,
以下是使用示例:
Func<int, bool> myFunc = null;//全部变量
myFunc = x => CheckIsInt32(x);
//给委托封装方法的地方 使用了Lambda表达式
private bool CheckIsInt32(int pars)//被封装的方法
{
return pars == 5;
}
bool ok = myFunc(5);//调用委托
MSDN:http://msdn.microsoft.com/zh-cn/library/bb534303(VS.95).aspx
但是如果我们需要所封装的方法不返回值,增么办呢?就使用Action!
可以使用
Action<T1, T2, T3, T4>委托以参数形式传递方法,而不用显式声明自定义的委托。封装的方法必须与此委托定义的方法签名相对应。也就是说,封装的方法必须具有四个均通过值传递给它的参数,并且不能返回值。(在 C# 中,该方法必须返回 void。在 Visual Basic 中,必须通过 Sub…End Sub 结构来定义它。)通常,这种方法用于执行某个操作。
使用方法和Func类似!
MSDN:http://msdn.microsoft.com/zh-cn/library/bb548654(VS.95).aspx
Action:既没有返回,也没有参数,使用方式如下:
Action
action = null;//定义action
action = CheckIsVoid;//封装方法,只需要方法的名字
action();//调用
总结:
使用Func<T,TResult>和Action<T>,Action而不使用Delegate其实都是为了简化代码,使用更少的代码达到相同的效果,不需要我们显示的声明一个委托。
Func<T,TResult>的最后一个参数始终是返回类型,而Action<T>是没有返回类型的,而Action是没有返回类型和参数输入的。
MVC开发笔记
使用session给视传递参数各种方式
Linux上部署ASP.NET Core
CentOS安装ASP.NET core运行环境
可以安装文件传输软件便于传输文件MobaXterm
yum update
yum insytall net-tools
注册镜像地址
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
安装ASP.NET Core SDK
sudo yum update
sudo yum install donet-sdk-6.0
关闭防火墙
systemctl disable firewalld
VS20022发布运行到Linux上的asp.net core,要改项目的launchSetting.json里的
项目URL地址
启动
用MobaXTerm上传到linux
cd /root/NET6Publish/
ls
clear
dotnet Advanced.NET6.Project.dll --urls=http://192.168.3.91:5999
无值守启动
nohup dotnet Advanced.NET6.Project.dll --urls=http://192.168.3.91:5999 &
让进程不停止
dotnet Advanced.NET6.Project.dll --urls=http://192.168.3.91:5999 &
面向切面编程AOP
Aspect Oriented Programming在不修改之前的代码为基础,可以动态的增加业务逻辑
如果可以再已经成型的程序众,如果可以动态的在一些行为之前增加点内容,在一些行为之后增加点内容--之前已经开发好的内容保持不变
在ASP.NET Core中使用Redis作为Session
前言
Session 是保存用户和 Web 应用的会话状态的一种方法,ASP.NET Core 提供了一个用于管理会话状态的中间件。在本文中我将会简单介绍一下 ASP.NET Core 将Redis作为 Session 的使用方法。
要将Redis作为Session的前提条件是安装并启用了Session,并在Nuget中安装以下两个包:
Microsoft.AspNetCore.Session
Microsoft.Extensions.Caching.Redis
Windows版Redis下载地址:https://github.com/MSOpenTech/redis/releases/download/win-3.2.100/Redis-x64-3.2.100.msi
使用
需要注意的一点是,要使用Session,必须将
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
中的options.CheckConsentNeeded = context => true;修改为options.CheckConsentNeeded = context => false;true表示用户是否同意cookie协议。当为true时而又无弹窗提示用户是否同意时,将导致session无法回传,故设置为false才可正常使用session。因为SessionID是存放在用户浏览器Cookie当中的,如果不回传SessionId,肯定就没法获取当前设置的Session。
1、Redis连接字符串
在appsettings.json中添加Redis连接字符串。
"ConnectionStrings": {
"RedisSessionConnectionString": "127.0.0.1:6379,password=easy_net_770702827,ConnectTimeout=3000,defaultdatabase=1"
},
2、配置
在Startup.cs中的 ConfigureServices方法下添加:
//获取连接字符串
var sessionConnectionString = Configuration.GetConnectionString("RedisSessionConnectionString");
//使用Session
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(30);
options.Cookie.HttpOnly = true;
});
//使用Redis作为Session缓存
services.AddDistributedRedisCache(options =>
{
options.Configuration = sessionConnectionString;
options.InstanceName = "HFMSCache";
});
此时 ConfigureServices 方法如下所示:
public void ConfigureServices(IServiceCollection services)
{
var sessionConnectionString = Configuration.GetConnectionString("RedisSessionConnectionString");
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
//使用Session
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(30);
options.Cookie.HttpOnly = true;
});
//使用Redis作为Session缓存
services.AddDistributedRedisCache(options =>
{
options.Configuration = sessionConnectionString;
options.InstanceName = "HFMSCache";
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
3、启用Session
在Configure方法中添加:
app.UseSession();
注意:UseSession必须在UseMvc之前!
此时 Configure 方法如下所示:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseSession();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
4、测试
在HomeController下面修改方法Index和添加方法Set。分别是设置Session和获取Session,这里就不再赘述,直接列出代码。
public IActionResult Index()
{
string user = HttpContext.Session.GetString("USER");
if (string.IsNullOrEmpty(user))
{
ViewBag.Value = "Get user data failed.";
}
else
{
ViewBag.Value = user;
}
return View();
}
public IActionResult Set()
{
HttpContext.Session.SetString("USER", "https://www.quarkbook.com/");
return Content("Set value successful.");
}
上一篇:.NET Core 基础知识
下一篇:vs2022永久密钥