Asp.NetCore3.1
Asp.NetCore3.1
.NetCore Framework 都属于框架 并列:大家是不同的框架,都有自己的CLR。
Asp.Net Core是一套Web开发框架
全家桶--.NetFramework---配置齐全直接用—但是会付出额外成本(淹没陈本)
自选式—Asp.NetCore—只有基本骨架,需要自行配置—要什么组装什么---最小声明---组件化开发
https://github.com/aspnet/AspNetCore 源码地址
创建Web项目示例
比如我们创建一个Asp.Net Core Web的项目,是支持MVC的,:
选择3.1版本:
创建完成:
我们往页面传几个值看看:
public class HomeController : Controller { private readonly ILogger<HomeController> _logger; public HomeController(ILogger<HomeController> logger) { _logger = logger; } public IActionResult Index() { base.ViewBag.User1 = "天天"; base.ViewData["User2"] = "ganet"; base.TempData["User3"] = "jerry"; object name = "ivy"; return View(name); } public IActionResult Privacy() { return View(); } [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] public IActionResult Error() { return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); } }
View层
@model System.String @using Microsoft.AspNetCore.Http; @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <h2>@base.ViewBag.User1</h2> <h2>@base.ViewData["User2"]</h2> <h2>@base.TempData["User3"]</h2> <h2>@Model</h2> <h2>@base.Context.Session.GetString("User4")</h2>
结果:
Asp.Net Core需要配置Session才能用
需要在下面配置:
示例:
Control层
public IActionResult Index() { base.ViewBag.User1 = "天天"; base.ViewData["User2"] = "ganet"; base.TempData["User3"] = "jerry"; //session还需要配置? 以前直接用就好了 ashx默认没有session string result = base.HttpContext.Session.GetString("User4"); //声明接口时,只提供最基本的诉求,扩展性的都没有了, if (string.IsNullOrWhiteSpace(result)) { base.HttpContext.Session.SetString("User4", "session test"); } object name = "ivy"; return View(name); }
View
@model System.String @using Microsoft.AspNetCore.Http; @{ ViewData["Title"] = "Home Page"; } <div class="text-center"> <h1 class="display-4">Welcome</h1> <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p> <h2>@base.ViewBag.User1</h2> <h2>@base.ViewData["User2"]</h2> <h2>@base.TempData["User3"]</h2> <h2>@Model</h2> <h2>@base.Context.Session.GetString("User4")</h2> </div>
结果:
日志记录
可以继续使用log4来实现
(1) 我们可以通过Program方式来使用,在Program类中:
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run();//启动个kestrel } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args)//就是指定kestrel .ConfigureLogging(loggingBuilder => { loggingBuilder.AddLog4Net();//需要配置文件 }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>();//靠Startup来串起来MVC }); }
配置文件log4net.Config:
<?xml version="1.0" encoding="utf-8"?> <log4net> <!-- Define some output appenders --> <appender name="rollingAppender" type="log4net.Appender.RollingFileAppender"> <file value="log\log.txt" /> <!--追加日志内容--> <appendToFile value="true" /> <!--防止多线程时不能写Log,官方说线程非安全--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--可以为:Once|Size|Date|Composite--> <!--Composite为Size和Date的组合--> <rollingStyle value="Composite" /> <!--当备份文件时,为文件名加的后缀--> <datePattern value="yyyyMMdd.TXT" /> <!--日志最大个数,都是最新的--> <!--rollingStyle节点为Size时,只能有value个日志--> <!--rollingStyle节点为Composite时,每天有value个日志--> <maxSizeRollBackups value="20" /> <!--可用的单位:KB|MB|GB--> <maximumFileSize value="3MB" /> <!--置为true,当前最新日志文件名永远为file节中的名字--> <staticLogFileName value="true" /> <!--输出级别在INFO和ERROR之间的日志--> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="ALL" /> <param name="LevelMax" value="FATAL" /> </filter> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/> </layout> </appender> <root> <priority value="ALL"/> <level value="ALL"/> <appender-ref ref="rollingAppender" /> </root> </log4net>
(2)Startup中实现
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } // 使用Log4日志 loggerFactory.AddLog4Net(); app.UseSession(); app.UseHttpsRedirection(); app.UseStaticFiles(new StaticFileOptions() { FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot")) }); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
(3)用法
public class FirstController : Controller { private readonly ILogger<FirstController> _logger; private readonly ILoggerFactory _loggerFactory; public FirstController(ILogger<FirstController> logger, ILoggerFactory loggerFactory) { _logger = logger; this._loggerFactory = loggerFactory; } public IActionResult Index() { // 第一种用法 this._logger.LogWarning("This is FirstController-Index"); // 第二种用法 this._loggerFactory.CreateLogger<FirstController>().LogWarning("This is FirstController-Index 1"); return View(); } }
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术