Program.cs Startup.cs ErrorHandlingMiddleware.cs StaticHttpContextExtensions.cs https://www.strathweb.com/2016/12/accessing-httpcontext-outside-of-fra ...
Program.cs
using System; using System.IO; using GitCenter; using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Model; using NLog.Web; namespace Program { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); //獲取應用程式的當前工作目錄。 string pathToRoot = Directory.GetCurrentDirectory(); //用於構建基於鍵/值的配置設置以在應用程式中使用。 IConfigurationBuilder builder = new ConfigurationBuilder() .SetBasePath(pathToRoot)//將基於文件的提供程式的文件提供程式設置為具有基本路徑的物理文件提供程式。 .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)//在構建器的路徑中添加JSON配置提供程式 .AddEnvironmentVariables();//添加一個Microsoft.Extensions.Configuration.IConfigurationProvider,它從環境變數中讀取配置值。 Model.CoinAppSettings.CreateInstence(builder.Build()); WebHost.CreateDefaultBuilder(args)//使用預配置的預設值初始化Microsoft.AspNetCore.Hosting.WebHostBuilder類的新實例。 .UseContentRoot(pathToRoot)//指定Web主機要使用的內容根目錄。 .UseStartup<Startup>()//指定Web主機要使用的啟動類型。 .ConfigureLogging(logging => //添加一個委托來配置提供的Microsoft.Extensions.Logging.ILoggingBuilde。這可以多次調用。 { //在Microsoft.Extensions.Logging.ILoggingBuilder中設置日誌記錄服務的擴展方法。 logging.ClearProviders();//清除提供商 logging.SetMinimumLevel(LogLevel.Error);//設置最低級別 }) .UseKestrel(options => {//將Kestrel指定為Web主機要使用的伺服器。 options.Limits.MinRequestBodyDataRate = null;//獲取或設置請求體最小數據速率,以位元組/秒為單位。 將此屬性設置為null表示不應強制實施最低數據速率。 此限制對始終無限制的升級連接沒有影響。 這可以通過Microsoft.AspNetCore.Server.Kestrel.Core.Features.IHttpMinRequestBodyDataRateFeature按請求覆蓋。 預設為240位元組/秒,寬限期為5秒。 }) .UseNLog()//使用NLog作為依賴註入記錄器。 .UseUrls("127.0.0.1:6666")//指定Web主機將偵聽的URL。//Models.CoinAppSettings.Instance.AppSettings.ApiHost .Build()//構建托管Web應用程式的Microsoft.AspNetCore.Hosting.IWebHost。 .Run();//運行Web應用程式並阻止調用線程,直到主機關閉。 } } }
Startup.cs
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; namespace GitCenter { public class Startup { public Startup() { } public void ConfigureServices(IServiceCollection services) //指定服務描述符集合的合同。 { services .AddMvc()//將MVC服務添加到指定的服務集合 .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)//為應用程式設置ASP.NET Core MVC的相容版本。//指定由Microsoft.AspNetCore.Mvc.MvcOptions配置的運行時行為的版本相容性。 .AddSessionStateTempDataProvider()//將會話狀態臨時數據提供程式註冊為服務集合中的預設臨時數據提供程式。 .AddJsonOptions(options => //全局配置Json序列化處理 { //不使用駝峰樣式的key options.SerializerSettings.ContractResolver = new DefaultContractResolver(); //忽略迴圈引用 options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; //設置時間格式 options.SerializerSettings.DateFormatString = "yyyy-MM-dd"; } ); services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();//Adds a singleton service of the type specified in TService with an implementation type specified in TImplementation to the specified Microsoft.Extensions.DependencyInjection.IServiceCollection. } /// <summary> /// /// </summary> /// <param name="app">定義一個類,該類提供配置應用程式請求管道的機制。</param> /// <param name="env">提供有關運行應用程式的Web托管環境的信息。</param> public void Configure(IApplicationBuilder app, IHostingEnvironment env) { //檢查當前主機環境名稱是否為Microsoft.AspNetCore.Hosting.EnvironmentName.Development。 if (env.IsDevelopment()) { app.UseDeveloperExceptionPage();//從管道捕獲同步和非同步System.Exception實例並生成HTML錯誤響應。 } else { app.UseExceptionHandler("/Error");//向管道添加中間件,以捕獲異常,記錄異常,重置請求路徑,然後重新執行請求。 如果響應已經開始,則不會重新執行請求。 } app.UseStaticHttpContext(); app.UseMiddleware(typeof(ErrorHandlingMiddleware)); app.UseMvc(routes => { routes.MapRoute("default", "api/{controller=Home}/{action=Index}/{id?}"); }); } } }
ErrorHandlingMiddleware.cs
using System; using System.Net; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; namespace GitCenter { public class ErrorHandlingMiddleware { static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private readonly RequestDelegate next; public ErrorHandlingMiddleware(RequestDelegate next) => this.next = next; public async Task Invoke(HttpContext context) { try { await next(context); } catch (Exception ex) { HandleExceptionAsync(context, ex); } } private static void HandleExceptionAsync(HttpContext context, Exception error) { int statusCode = (int)HttpStatusCode.InternalServerError; if (error is UnauthorizedAccessException) { // to prevent login prompt in IIS // which will appear when returning 401. statusCode = (int)HttpStatusCode.Forbidden; } if (statusCode != 404 && statusCode != 403) { logger.Error(error); } } } }
StaticHttpContextExtensions.cs
public static class StaticHttpContextExtensions { public static void AddHttpContextAccessor(this IServiceCollection services) { services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); } public static IApplicationBuilder UseStaticHttpContext(this IApplicationBuilder app) { IHttpContextAccessor httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>(); HttpContextExtensions.Configure(httpContextAccessor); return app; } }
https://www.strathweb.com/2016/12/accessing-httpcontext-outside-of-framework-components-in-asp-net-core/
http://www.cnblogs.com/xishuai/p/asp-net-core-webapi-error-handling-middleware.html