ASP.NET Core小技巧(返回字段跟定义的一致、自定义路由、全局异常处理、日期时间格式设置、空处理)
Posted on 2020-11-14 11:26 樱木007 阅读(281) 评论(0) 编辑 收藏 举报1.返回字段跟定义的一致(默认返回的字段为首字母小写)
public void ConfigureServices(IServiceCollection services) { services.AddMvc().AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNamingPolicy = null; }); }
2.自定义路由
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } #region 自定义路由配置 app.UseMvc(routes => { // 自定义路由 routes.MapRoute( name: "default1", template: "api/{controller}/{action}/{id?}", defaults: new { controller = "Values", action = "Index" }); // 默认路由 routes.MapRoute( name: "default", template: "{controller}/{action}/{id?}", defaults: new { controller = "Values", action = "Index" }); }); #endregion }
3.允许跨域设置
public void ConfigureServices(IServiceCollection services) { #region 跨域设置 services.AddCors(options => { options.AddPolicy("AppDomain", builder => { builder.AllowAnyOrigin() // Allow access to any source from the host AllowAnyMethod() // Ensures that the policy allows any method AllowAnyHeader() // Ensures that the policy allows any header .AllowCredentials(); // Specify the processing of cookie }); }); #endregion services.AddMvc(); }
4.json数据,string类型字段返回为null时默认返回空字符串
public sealed class NullWithEmptyStringResolver : DefaultContractResolver { protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) { return type.GetProperties() .Select(p => { var jp = base.CreateProperty(p, memberSerialization); jp.ValueProvider = new NullToEmptyStringValueProvider(p); return jp; }).ToList(); } /// <summary> /// 将所有返回字段转换为小写 /// </summary> /// <param name="propertyName"></param> /// <returns></returns> //protected override string ResolvePropertyName(string propertyName) //{ // return propertyName.ToLower(); //} } public class NullToEmptyStringValueProvider : IValueProvider { PropertyInfo _MemberInfo; public NullToEmptyStringValueProvider(PropertyInfo memberInfo) { _MemberInfo = memberInfo; } public object GetValue(object target) { object result = _MemberInfo.GetValue(target); if (result == null) { var type = _MemberInfo.PropertyType; if (type == typeof(string)) result = ""; //else if (type == typeof(DateTime?)) // result = new DateTime(1, 1, 1); } return result; } public void SetValue(object target, object value) { _MemberInfo.SetValue(target, value); } } public void ConfigureServices(IServiceCollection services) { services.AddMvc().AddJsonOptions(options => { options.SerializerSettings.Formatting = Formatting.Indented; // 返回数据格式缩进(按需配置) options.SerializerSettings.ContractResolver = new NullWithEmptyStringResolver(); // 字段为字符串返回为null时,默认返回空 }); }
5.json数据,自定义日期格式
(1) 定义一个继承System.Text.Json.Serialization.JsonConverter的类,实现其Read 和 Write两个抽象方法
using System; using System.Text.Json; using System.Text.Json.Serialization; namespace Redis.WebApi.Extensions { public class DateTimeConverter : JsonConverter<DateTime> { public string DateTimeFormat { get; set; } = "yyyy-MM-dd HH:mm:ss"; public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => DateTime.Parse(reader.GetString()); public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) => writer.WriteStringValue(value.ToString(this.DateTimeFormat)); } }
(2)在Startup.cs下添加以下代码
public void ConfigureServices(IServiceCollection services) { services.AddMvc().AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new DateTimeConverter()); }); }
1、自定义一个全局异常处理类中间件
using Microsoft.AspNetCore.Http; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Threading.Tasks; using System.Xml.Serialization; using UFX.Mall.EntityModel; using UFX.Tools; namespace UFX.Mall.WebApi { public class ExceptionHandlerMiddleWare { private readonly RequestDelegate next; public ExceptionHandlerMiddleWare(RequestDelegate next) { this.next = next; } public async Task Invoke(HttpContext context) { try { await next(context); } catch (Exception ex) { await HandleExceptionAsync(context, ex); } } private static async Task HandleExceptionAsync(HttpContext context, Exception exception) { if (exception == null) return; await WriteExceptionAsync(context, exception).ConfigureAwait(false); } private static async Task WriteExceptionAsync(HttpContext context, Exception exception) { //记录日志 LogHelper.Error(exception.GetBaseException().ToString()); //返回友好的提示 var response = context.Response; //状态码 if (exception is UnauthorizedAccessException) response.StatusCode = (int)HttpStatusCode.Unauthorized; else if (exception is Exception) response.StatusCode = (int)HttpStatusCode.BadRequest; response.ContentType = context.Request.Headers["Accept"]; if (response.ContentType.ToLower() == "application/xml") { await response.WriteAsync(Object2XmlString(ResultMsg.Failure(exception.GetBaseException().Message))).ConfigureAwait(false); } else { response.ContentType = "application/json"; await response.WriteAsync(JsonConvert.SerializeObject(ResultMsg.Failure(exception.GetBaseException().Message))).ConfigureAwait(false); } } /// <summary> /// 对象转为Xml /// </summary> /// <param name="o"></param> /// <returns></returns> private static string Object2XmlString(object o) { StringWriter sw = new StringWriter(); try { XmlSerializer serializer = new XmlSerializer(o.GetType()); serializer.Serialize(sw, o); } catch { //Handle Exception Code } finally { sw.Dispose(); } return sw.ToString(); } } }
2、configure注册
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddConsole(Configuration.GetSection("Logging")); loggerFactory.AddDebug(); //配置NLog loggerFactory.AddNLog(); env.ConfigureNLog("nlog.config"); app.UseApplicationInsightsRequestTelemetry(); app.UseApplicationInsightsExceptionTelemetry(); //异常处理中间件 app.UseMiddleware(typeof(ExceptionHandlerMiddleWare)); app.UseMvc(); ; }
分类:
.NET Core
标签:
.NET CORE3.1
, C#小技巧
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义