ASP.NET Core 1.0基礎之診斷

MerGrills 8年前發布 | 21K 次閱讀 ASP.NET .NET開發

來自: http://www.cnblogs.com/yanbinliu/p/5173206.html

來源https://docs.asp.net/en/latest/fundamentals/diagnostics.html

ASP.NET Core 1.0包含了一些新的特性來輔助診斷問題。可以在Startup類中輕易地配置不同的handler來處理應用程序錯誤,顯示額外信息。

配置錯誤處理頁面

ASP.NET Core 1.0中可以在Startup類的Configure方法中為每個Request請求配置處理管道。在開發中,你可以非常方便地配置一個簡單的錯誤處理頁面。你只需要添加項目對Microsoft.AspNet.Diagnostics的依賴,然后在Configure方法中添加一行代碼。

using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Diagnostics;
using Microsoft.AspNet.Hosting;
using Microsoft.AspNet.Http;
using System;
using Microsoft.Extensions.DependencyInjection;

namespace DiagDemo { public class Startup { // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (string.Equals(env.EnvironmentName, "Development", StringComparison.OrdinalIgnoreCase))
        {
            app.UseDeveloperExceptionPage();

            app.UseRuntimeInfoPage(); // default path is /runtimeinfo
        }
        else
        {
            // specify production behavior for error handling, for example:
            // app.UseExceptionHandler("/Home/Error");
            // if nothing is set here, exception will not be handled.
        }

        app.UseWelcomePage("/welcome");

        app.Run(async (context) =>
        {
            if(context.Request.Query.ContainsKey("throw")) throw new Exception("Exception triggered!");
            context.Response.ContentType = "text/html";
            await context.Response.WriteAsync("<html><body>Hello World!");
            await context.Response.WriteAsync("<ul>");
            await context.Response.WriteAsync("<li><a href=\"/welcome\">Welcome Page</a></li>");
            await context.Response.WriteAsync("<li><a href=\"/?throw=true\">Throw Exception</a></li>");
            await context.Response.WriteAsync("</ul>");
            await context.Response.WriteAsync("</body></html>");
        });
    }
}

}</pre>

如上代碼是在ASP.NET Core 1.0中的空模板中創建的,只包含了簡單異常處理產生機制(在36行)。如果querystring的“throw” key的值不為空,就會拋出異常。然后會調用21行的UseDeveloperExceptionPage方法,來調用中間件。

注意到調用UseDeveloperExceptionPage在包含在if代碼塊中間的,會先檢查當前環境。這是很好的實踐方式,因為你可能不愿意在生產環境中公開展示程序診斷信息。if語句會使用ASPNET_ENV環境變量,如果你使用的VS2015,你可以在web項目屬性中自定義環境變量。如下

將ASPNET_ENV 設置任何非Development的值,應用都不會調用UseDeveloperExceptionPage方法,而是返回500錯誤(沒有任何詳細信息,除非你配置了UseExceptionHandler())。在下面我們會看到error page所提供的特性(確保ASPNET_ENV被設置回Development)。

在開發中使用error page

在web處理管道中發生未處理異常時,默認error page會顯示一些有用的診斷信息。error page有幾個tab來顯示請求中異常相關的信息。第一個tab顯示stack trace

第二tab顯示Querystring 相關的信息

如上,你可以看到請求中傳遞的throw參數的值。本次請求沒有cookie,如果有的話,會在Cookies tab中。你可以看到傳遞的headers的值,如下。

Note:當前pre-release版本,ErrorPage的Cookies部分還不可用。詳見 ErrorPage Source

Azure上的Http 500錯誤

運行時info page

除了配置和顯示錯誤頁面外,你也可以通過調用擴展方法UseRuntimeInfoPage來添加運行時信息頁面。如下代碼,就可以開啟該功能。

app.UseRuntimeInfoPage();

一旦添加了如上代碼,你就可以輸入/runtimeinfo來查看運行時信息、包信息等。如下。

</div>

當然這個請求路徑是可以更改的,你可以在調用UseRuntimeInfoPage()方法時指定。這個方法接收一個 RuntimeInfoPageOptions實例作為參數,它有一個Path屬性。例如,指定/info路徑,你可以像如下調用UseRuntimeInfoPage。

app.UseRuntimeInfoPage("/info")

同UseDeveloperExceptionPage()擴展方法一樣,限制公共對診斷信息的獲取。因此本例中,值在開發環境中調用UseRuntimeInfoPage()方法。

Note:記住Startup類中的Configure方法定義的管道對所有的請求都是有效的,因此管道配置順序是很重要的。例如,如果你把UseRuntimeInfoPage()的調用放在app.Run()之后,則該方法是不會被調用的。因為app.Run會在調用UseRuntimeInfoPage之前處理請求。

</div>

welcome頁面

另一個有用的擴展方法是UseWelcome(),尤其是你在第一次運行ASP.NET Core 1.0程序時。配置如下。

app.UseWelcome()

一旦調用該方法,它會處理所有請求,并返回很cool的hello頁面(默認情況下)。如下。

</div>

你也可以配置歡迎頁面只響應某些路徑(和UseRuntimeInfoPage類似)。如下代碼配置了歡迎頁面只響應/welcome路徑(別的請求路徑將會忽略,轉交給下個管道handler)。

app.UseWelcomePage("/welcome");

按照本文如上配置Configure方法,將會按如下方式響應請求。

Path Result /runtimeinfo UseRuntimeInfoPage will handle and display runtime info page
/welcome UseWelcomePage will handle and display welcome page
paths without ?throw= app.Run() will respond with “Hello World!”
paths with ?throw= app.Run() throws an exception; UseErrorPage handles, displays an error page

Summary

在ASP.NET Core 1.0中,你可以很簡單的添加error page,查看diagnostic信息,或者簡單的響應一個歡迎頁面。

</div>

 本文由用戶 MerGrills 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!