.NETcore掛載服務,初始化,異常處理等

来源:https://www.cnblogs.com/whoislikegod/archive/2018/10/31/9842306.html
-Advertisement-
Play Games

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 文件操作 open() 文件句柄 open()打開一個文件, 獲取的是文件句柄 read() #讀取全部內容 read(n)#讀取前n個字元 readline()#讀取一行 且讀取出來末尾都有\n readlines()#讀取全部 每一⾏形成一個元素並放到列表 註意: 讀取完的文件句柄一定要關 ...
  • package zrs; public class javaDay02_3 { public static void main(String[] args){ //switch 結構 int x=5; switch(x){//x 支持byte short int char 5.0以後 enum St ...
  • ·字元串(string) @ title @ title @ 小結: ·字元串(string) @ title @ title @ 小結: ****** 幾米花的Python ****** 博客主頁:https://www.cnblogs.com/jimmy-share/ 歡迎轉載 ~ ...
  • [TOC] 1. 函數名的使用 其實函數名也是一個變數,但它是一個比較特殊的變數,與小括弧配合可以執行函數的變數: 函數名其實和記憶體一樣,也可以使用 查看它的記憶體地址: 函數名賦值給其他變數 函數也能當作容器類的元素: 函數名也能當作函數的參數: 函數名也可以作為函數的返回值: 2. 閉包 閉包是指 ...
  • 界面如下圖: 動圖效果演示: ...
  • 加群731738614加群731738614 ...
  • 最近項目上需要通過MVVM來控制TreeView,其中需要需要控制通過搜索來定位某個節點,正常邏輯下,首先通過需要在樹上面找到該節點,然後選中該節點,並將該節點的父節點展開,這個時候需要通過MVVM來控制,需要綁定起來,只是一直沒有binding上,代碼如下: MVVM示例代碼: 界面代碼: 數據的 ...
  • 在做項目時,經常會遇到“離我最近”這種需求。顧名思義,它需要根據用戶的經緯度和事物的經緯度計算距離,然後進行排序,最後分頁(當然這些操作要在資料庫中進行,否則就變成假分頁了)。 我們通常可以用sql語句來實現 但是我比較習慣使用 entity framework,於是我就想著能不能用 entity ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...