ASP.NET Core 异常和错误处理 - ASP.NET Core 基础教程 - 简单教程,简单编程

原文:ASP.NET Core 异常和错误处理 - ASP.NET Core 基础教程 - 简单教程,简单编程

ASP.NET Core 异常和错误处理

上一章节中,我们学习了 ASP.NET Core 中的 中间件, 知道中间件是一种装配到应用程序管道以处理请求和响应的组件

本章节我们继续来深入了解中间件,这次我们学习的将会是异常和错误处理中间件

当我们的 ASP.NET Core 应用程序出现错误时,我们有多种方式处理它们

上一章节中提到的 Microsoft.AspNetCore.Diagnostics NuGet 包提供了相关的附加的中间件,这些中间件可以帮助我们处理异常和错误

app.UseDeveloperExceptionPage 中间件

为了模拟错误,我们回到 app.Run() 方法,看看如果我们每次命中这个中间件时抛出异常,应用程序的行为会是怎么样的

public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.Run(async (context) => { throw new System.Exception("Throw Exception"); var msg = Configuration["message"]; await context.Response.WriteAsync(msg); }); } 

保存 Startup.cs 页面并运行应用程序,显示如下

我们可以看到一个错误页面,显示 HTTP 500 错误,一个内部服务器错误

提示在文件 Startup.cs 42 行的代码中抛出了一个异常 Throw Exception

当然了,这是在调试模式下,如果我们注释掉调试模式,也就是注释掉下面的语句

public void Configure(IApplicationBuilder app, IHostingEnvironment env) { /*  if (env.IsDevelopment())  {  app.UseDeveloperExceptionPage();  }  */ app.Run(async (context) => { throw new System.Exception("Throw Exception"); var msg = Configuration["message"]; await context.Response.WriteAsync(msg); }); } 

保存 Startup.cs 页面并运行应用程序,它只会抛出一个非常通用的消息,显示如下

我们可以看到没有加载这个资源。因为发生了一个 HTTP 500 错误,一个内部服务器错误,这不是很有帮助

但对于线上环境来说,它隐藏了错误的原因和位置,增加了应用程序的安全性

app.UseDeveloperExceptionPage

现在,我们回到中间件 app.UseDeveloperExceptionPage

这个中间件与其它中间件有些不同,其它中间件通常会检查传入的请求并对该请求做出一些响应

UseDeveloperExceptionPage 中间件不关心传入的请求,因为它总是在管道后发生

它会调用下一个中间件,然后等待管道后面的任何事情是否会产生异常,如果有异常,这个中间件会给返回一个错误页面,并显示有关该异常的详细信息

我们还可以从 UseDeveloperExceptionPage 中间件返回的结果中看到原始异常详细信息

所有这些信息对开发人员都非常有用

当然,事实上,我们可能只想在开发人员运行应用程序时显示这些信息,也就是开发环境上显示异常的详细信息,而在线上环境则显示一个 500 服务器异常信息页面

这会在稍后的章节中继续学习,本章节我们将不做任何深入研究

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ASP.NET Core 提供了内置的身份验证和授权功能,可以轻松地实现用户的登录和登出功能。 要实现登录功能,首先需要在 ConfigureServices 方法中添加身份验证服务: ```csharp services.AddAuthentication(options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = GoogleDefaults.AuthenticationScheme; }) .AddCookie(options => { options.LoginPath = "/Account/Login/"; options.LogoutPath = "/Account/Logout/"; }) .AddGoogle(options => { options.ClientId = Configuration["Authentication:Google:ClientId"]; options.ClientSecret = Configuration["Authentication:Google:ClientSecret"]; }); ``` 上面的代码中,我们添加了 Cookie 身份验证服务,并指定了登录和登出的路径。同时,我们还添加了 Google 身份验证服务,并设置了 ClientId 和 ClientSecret。 接着,在 Configure 方法中启用身份验证中间件: ```csharp app.UseAuthentication(); ``` 现在,我们可以在 AccountController 中添加 Login 和 Logout 的动作方法: ```csharp public IActionResult Login(string returnUrl = "/") { ViewData["ReturnUrl"] = returnUrl; return View(); } [HttpPost] public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = "/") { if (ModelState.IsValid) { var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false); if (result.Succeeded) { _logger.LogInformation("User logged in."); return RedirectToLocal(returnUrl); } if (result.RequiresTwoFactor) { return RedirectToAction(nameof(LoginWith2fa), new { returnUrl, model.RememberMe }); } if (result.IsLockedOut) { _logger.LogWarning("User account locked out."); return RedirectToAction(nameof(Lockout)); } else { ModelState.AddModelError(string.Empty, "Invalid login attempt."); return View(model); } } // If we got this far, something failed, redisplay form return View(model); } [HttpPost] public async Task<IActionResult> Logout() { await _signInManager.SignOutAsync(); _logger.LogInformation("User logged out."); return RedirectToAction(nameof(HomeController.Index), "Home"); } ``` 上面的代码中,我们首先添加了一个 Get 请求的 Login 方法,用于显示登录页面。接着,我们添加了一个 Post 请求的 Login 方法,用于处理用户提交的登录表单。在这个方法中,我们调用了 _signInManager.PasswordSignInAsync 方法进行身份验证,并根据不同的结果进行相应的处理。最后,我们还添加了一个 Logout 方法,用于处理用户的登出请求。 现在,我们只需要在视图中添加相应的表单,就可以实现登录和登出功能了: ```html <form asp-action="Login" asp-route-returnUrl="@ViewData["ReturnUrl"]" method="post"> <div class="form-group"> <label asp-for="Email"></label> <input asp-for="Email" class="form-control" /> <span asp-validation-for="Email" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Password"></label> <input asp-for="Password" class="form-control" /> <span asp-validation-for="Password" class="text-danger"></span> </div> <div class="form-group"> <div class="checkbox"> <label asp-for="RememberMe"> <input asp-for="RememberMe" /> @Html.DisplayNameFor(m => m.RememberMe) </label> </div> </div> <div class="form-group"> <button type="submit" class="btn btn-primary">Login</button> </div> </form> <a asp-action="Logout" asp-controller="Account">Logout</a> ``` 上面的代码中,我们添加了一个登录表单和一个登出链接,用于演示登录和登出功能。其中,登录表单使用了 asp-for 和 asp-validation-for 标签帮助器,可以自动生成相应的 HTML 元素和验证信息。登出链接使用了 asp-action 和 asp-controller 标签帮助器,可以自动生成相应的 URL。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值