.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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...