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