<h1 class="h1">Asp.Net Core-異常處理</h1>
<ol class=" list-paddingleft-2"><li><p>Asp.Net Core-異常處理</p></li></ol>
<p>在這一章,我們將討論異常和錯誤處理。當 ASP.NET Core應用程式中發生錯誤時,您可以以各種不同的方式來處理。讓我們來看看透過新增一個中間件來處理異常情況,這個中間件將幫助我們處理錯誤。 </p>
<p>要模擬出錯,讓我們轉到應用程序,運行,如果我們只是拋出異常的話,看看程式是如何運作的。 </p>
<p class="cnblogs_code"><br></p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> 1 using Microsoft.AspNet.Builder;
2 using Microsoft.AspNet.Hosting;
3 using Microsoft.AspNet.Http;
4 using Microsoft.Extensions.DependencyInjection;
5 using Microsoft.Extensions.Configuration;
6 namespace FirstAppDemo {
7 public class Startup {
8 public Startup() {
9 var builder = new ConfigurationBuilder()
10 .AddJsonFile("AppSettings.json");
11 Configuration = builder.Build();
12 }
13 public IConfiguration Configuration { get; set; }
14 15 // This method gets called by the runtime.
16 // Use this method to add services to the container.
17 // For more information on how to configure your application,
18 // visit http://go.microsoft.com/fwlink/?LinkID=398940 19 public void ConfigureServices(IServiceCollection services) {
20 }
21 22 // This method gets called by the runtime.
23 // Use this method to configure the HTTP request pipeline.24 public void Configure(IApplicationBuilder app) {
25 app.UseIISPlatformHandler();
26 app.UseRuntimeInfoPage();
27 28 app.Run(async (context) => {
29 throw new System.Exception("Throw Exception");
30 var msg = Configuration["message"];
31 await context.Response.WriteAsync(msg);
32 });
33 }
34 35 // Entry point for the application. 36 public static void Main(string[] args) => WebApplication.Run<Startup>(args);
37 }
38 }</pre><div class="contentsignin">登入後複製</div></div>
<p> </p>
<p> </p>
<p># </p>
<p>它只會拋出一個非常通用的例外訊息。儲存Startup.cs頁面並執行您的應用程式。 </p>
<p><img src="https://img.php.cn/upload/article/000/001/506/470d228a9709dbe93d976747550661ed-0.jpg" alt=""></p>
<p>您將看到我們未能載入此資源。出現了一個 HTTP 500 錯誤,內部伺服器錯誤,那個頁面不是很有幫助。它可能很方便得到一些異常訊息。 </p>
<p>讓我們新增另一個中間件 UseDeveloperExceptionPage。 </p>
<p class="cnblogs_code"><br></p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> 1 // This method gets called by the runtime.
2 // Use this method to configure the HTTP request pipeline. 3 public void Configure(IApplicationBuilder app) {
4 app.UseIISPlatformHandler();
5 app.UseDeveloperExceptionPage();
6 app.UseRuntimeInfoPage();
7 8 app.Run(async (context) => {
9 throw new System.Exception("Throw Exception");
10 var msg = Configuration["message"];
11 await context.Response.WriteAsync(msg);
12 });
13 }14</pre><div class="contentsignin">登入後複製</div></div>
<p> </p>
<p> </p>
<p>這個中間件與其他的有點不同,其他中間件通常監聽傳入的請求並對請求做一些響應。 </p>
<p>UseDeveloperExceptionPage不會如此在意傳入的請求在之後的管道會發生什麼事。 </p>
<p>它只是呼叫下一個中間件,然後再等待,看看管道中是否會出現異常,如果有異常,這塊中間件會給你一個關於該異常的錯誤頁面。 </p>
<p>現在讓我們再次運行應用程式。將會產生一個如下面的螢幕截圖所示的輸出。 </p>
<p><img src="https://img.php.cn/upload/article/000/001/506/470d228a9709dbe93d976747550661ed-1.jpg" alt=""></p>
<p>現在如果程式中出現異常,您將在頁面中看到一些想要看到的異常資訊。你也會得到一個堆疊追蹤:這裡可以看到Startup.cs第37行有一個未處理的例外拋出。 </p>
<p>所有這些異常資訊對開發人員將非常有用。事實上,我們可能只希望當開發人員運行應用程式時才顯示這些異常資訊。 </p>
<p> </p>
<h1 class="h1">Asp.Net Core 靜態檔案</h1>
<ol class=" list-paddingleft-2">
<li><p>#Asp.Net Core 靜態檔案</p></li>
<li><p>案例</p></li>
</ol>
<p>在這一章,我們將學習如何使用檔案。幾乎每個web應用程式都需要一個重要特性:能夠從檔案系統提供檔案(靜態檔案)。 </p>
<ul class=" list-paddingleft-2">
<li><p>靜態檔案像JavaScript檔案、圖片、CSS檔案等,我們Asp.Net Core應用程式可以直接提供給客戶。 </p></li>
<li><p>靜態檔案通常位於web根(wwwroot)資料夾。 </p></li>
<li><p>預設情況下,這是我們可以直接從檔案系統提供檔案的唯一的地方。 </p></li>
</ul>
<p> </p>
<hr>
<h2>案例</h2>
<p>現在讓我們透過一個簡單的範例來了解我們在我們的應用程式如何提供這些靜態檔案。 </p>
<p>在這裡,我們想要為我們的 FirstAppDemo 應用程式添加一個簡單的 HTML 文件,該 HTML 文件放在web 根 (wwwroot) 資料夾中。在解決方案資源管理器中右鍵點選wwwroot資料夾並選擇Add→新項目。 </p>
<p><img src="https://img.php.cn/upload/article/000/001/506/470d228a9709dbe93d976747550661ed-2.jpg" alt=""></p>
<p>在中間窗格中,選擇 HTML 頁面並稱為 index.html,按一下新增按鈕。 </p>
<p><img src="https://img.php.cn/upload/article/000/001/506/470d228a9709dbe93d976747550661ed-3.jpg" alt=""></p>
<p>你會看到一個簡單的index.html檔。讓我們在其中添加一些簡單的文字和標題如下所示。 </p>
<p class="syntaxhighlighter html"><br></p>
<table border="0">
<tbody><tr class="firstRow">
<td class="gutter">
<p class="line number1 index0 alt2">1</p>
<p class="line number2 index1 alt1">#2</p>
<p class="line number3 index2 alt2">3</p>
<p class="line number4 index3 alt1">4</p>
<p class="line number5 index4 alt2">5</p>
<p class="line number6 index5 alt1">6</p>
<p class="line number7 index6 alt2">7</p>
<p class="line number8 index7 alt1">8</p>
<p class="line number9 index8 alt2">#9</p>
<p class="line number10 index9 alt1">10</p>
</td>
<td class="code"> <p class="container"><br></p>
<p class="line number1 index0 alt2"><code class="html plain"><!DOCTYPE html> </code></p>
<p class="line number2 index1 alt1"><code class="html plain"><</code><code class="html keyword"></code><code class="html plain">#> </code></p>
<p class="line number3 index2 alt2"><code class="html spaces"> </code><code class="html plain"><</code><code class="html keyword">head</code><code class="html plain">> </code></p>#<p class="line number4 index3 alt1"><code class="html spaces"> </code><code class="html plain"></code><code class="html keyword">##元</code> <code class="html color1">字元集</code><code class="html plain">=</code>##"utf-8"<code class="html string"> </code>/> <code class="html plain"></code></p>
<p class="line number5 index4 alt2"> <code class="html spaces"></code>title<code class="html keyword"></code>>歡迎使用 ASP.NET Core<code class="html plain"></code>#title <code class="html keyword"></code>> <code class="html plain"></code></p>
<p class="line number6 index5 alt1"> <code class="html spaces"></code><code class="html plain"></code>#頭<code class="html keyword"></code>> <code class="html plain"></code></p>
<p class="line number7 index6 alt2"> <code class="html spaces"></code>body<code class="html keyword"></code>> <code class="html plain"></code></p>
<p class="line number8 index7 alt1"> <code class="html spaces"></code>你好,世界! 此訊息來自我們的第一個靜態 HTML 檔案。 <code class="html plain"></code></p>
<p class="line number9 index8 alt2"> <code class="html spaces"></code><code class="html plain"></code>body<code class="html keyword"></code>> <code class="html plain"></code></p>
<p class="line number10 index9 alt1"><code class="html plain"></code>html<code class="html keyword"></code>><code class="html plain"></code></p>
</td>
</tr></tbody>
<p>当您运行应用程序并在浏览器中输入index.html时,您将看到app.Run中间件将抛出一个异常,因为目前在我们的应用程序中什么都没有。</p>
<p><img src="https://img.php.cn/upload/article/000/001/506/315d89c3796749d419a682e7ec51873a-4.jpg" alt=""></p>
<p>现在我们的项目中没有中间件会去找文件系统上的任何文件。</p>
<p>为了解决这个问题,通过在解决方案资源管理器中右键单击您的项目并选择管理NuGet包进入到NuGet包管理器。</p>
<p><img src="https://img.php.cn/upload/article/000/001/506/315d89c3796749d419a682e7ec51873a-5.jpg" alt=""></p>
<p>搜索 Microsoft.AspNet.StaticFiles,会找到静态文件中间件。让我们安装此 nuget 程序包,现在我们可以在Configure方法中注册中间件。</p>
<p>让我们在下面的程序中所示的Configure方法中添加 UseStaticFiles 中间件。</p>
<p class="cnblogs_code"><br></p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> 1 using Microsoft.AspNet.Builder;
2 using Microsoft.AspNet.Hosting;
3 using Microsoft.AspNet.Http;
4 using Microsoft.Extensions.DependencyInjection;
5 using Microsoft.Extensions.Configuration;
6 namespace FirstAppDemo {
7 public class Startup {
8 public Startup() {
9 var builder = new ConfigurationBuilder()
10 .AddJsonFile("AppSettings.json");
11 Configuration = builder.Build();
12 }
13 public IConfiguration Configuration { get; set; }
14 15 // This method gets called by the runtime.
16 // Use this method to add services to the container.
17 // For more information on how to configure your application,
18 // visit http://go.microsoft.com/fwlink/?LinkID=398940 19 public void ConfigureServices(IServiceCollection services) {
20 }
21 22 // This method gets called by the runtime.
23 // Use this method to configure the HTTP request pipeline. 24 public void Configure(IApplicationBuilder app) {
25 app.UseIISPlatformHandler();
26 app.UseDeveloperExceptionPage(); app.UseRuntimeInfoPage();
27 app.UseStaticFiles();
28 29 app.Run(async (context) => {
30 throw new System.Exception("Throw Exception");
31 var msg = Configuration["message"];
32 await context.Response.WriteAsync(msg);
33 });
34 }
35 36 // Entry point for the application. 37 public static void Main(string[] args) => WebApplication.Run<Startup>(args);
38 }
39 }</pre><div class="contentsignin">登入後複製</div></div>
<p>除非你通过传入一些不同的配置参数来覆盖选项,否则静态文件会对于一个给定的请求看作是请求路径。这个请求路径是相对于文件系统。</p>
<ul class=" list-paddingleft-2">
<li><p>如果静态文件根据url找到一个文件,它将直接返回该文件,而不调用下一个块中间件。</p></li>
<li><p>如果没有找到匹配的文件,那么它会继续执行下一个块中间件。</p></li>
</ul>
<p>让我们保存Startup.cs文件并刷新浏览器。</p>
<p><img src="https://img.php.cn/upload/article/000/001/506/315d89c3796749d419a682e7ec51873a-6.jpg" alt=""></p>
<p>你现在可以看到index.html文件。你放置在wwwroot文件夹下任何地方的任何JavaScript文件、CSS文件或者HTML文件,您都能够在Asp.Net Core中直接当静态文件使用。</p>
<ul class=" list-paddingleft-2">
<li><p>在如果你想 让index.html作为您的默认文件,IIS一直有这种功能。</p></li>
<li><p>你可以给 IIS 一个默认文件列表。如果有人访问根目录,在这种情况下,如果 IIS 找到命名为 index.html的文件,它就会自动将该文件返回给客户端。</p></li>
<li><p>让我们现在开始进行少量更改。首先,我们需要删除强制的错误,然后添加另一块的中间件,这就是 UseDefaultFiles。以下是配置方法的实现。</p></li>
<li>
<p class="cnblogs_code"><br></p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> 1 / This method gets called by the runtime.
2 // Use this method to configure the HTTP request pipeline. 3 public void Configure(IApplicationBuilder app) {
4 app.UseIISPlatformHandler();
5 app.UseDeveloperExceptionPage();
6 7 app.UseRuntimeInfoPage();
8 app.UseDefaultFiles();
9 app.UseStaticFiles();
10 11 app.Run(async (context) => {
12 var msg = Configuration["message"];
13 await context.Response.WriteAsync(msg);
14 });
15 }</pre><div class="contentsignin">登入後複製</div></div>
<p> </p>
</li>
</ul>
<p> </p>
<ul class=" list-paddingleft-2">
<li><p>这段中间件将监听传入的请求,如果请求是根目录,就查看是否有匹配的默认文件。</p></li>
<li><p>您可以覆盖这个中间件的选项来告诉它如何匹配默认文件,但index.html是默认情况下的一个默认的文件。</p></li>
</ul>
<p>让我们保存 Startup.cs 文件并将您的浏览器转到 web 应用程序的根目录。</p>
<p><img src="https://img.php.cn/upload/article/000/001/506/315d89c3796749d419a682e7ec51873a-7.jpg" alt=""></p>
<p>你现在可以看到index.html是默认文件。你安装中间件的顺序是很重要的,因为如果你将UseDefaultFiles放置在UseStaticFiles之后,你将可能不会得到相同的结果。</p>
<p>如果你想要使用UseDefaultFiles和UseStaticFiles中间件,你可以使用另一个中间件Microsoft.aspnet.staticfiles,它也是NuGet包,它是一个服务器中间件。这本质上是以正确的顺序包含了默认文件和静态文件。</p>
<p class="cnblogs_code"><br></p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> 1 // This method gets called by the runtime.
2 // Use this method to configure the HTTP request pipeline. 3 public void Configure(IApplicationBuilder app) {
4 app.UseIISPlatformHandler();
5 app.UseDeveloperExceptionPage();
6 7 app.UseRuntimeInfoPage();
8 app. UseFileServer();
9 10 app.Run(async (context) => {
11 var msg = Configuration["message"];
12 await context.Response.WriteAsync(msg);
13 });
14 }</pre><div class="contentsignin">登入後複製</div></div>
<p> </p>
<p> </p>
<p>让我们再一次保存 Startup.cs 文件。一旦你刷新浏览器,你将看到相同的结果,如下面的屏幕快照所示。</p>
<p><img src="https://img.php.cn/upload/article/000/001/506/b33e085c39ca50d6c54911a15965303c-8.jpg" alt=""></p>
</table>
以上是asp.net core實例教學之異常處理與靜態檔案教學課程的詳細內容。更多資訊請關注PHP中文網其他相關文章!