diff --git a/KJD_WebService/Controllers/ImageCacheController.cs b/KJD_WebService/Controllers/ImageCacheController.cs index 4595e40..7871ae8 100644 --- a/KJD_WebService/Controllers/ImageCacheController.cs +++ b/KJD_WebService/Controllers/ImageCacheController.cs @@ -1,5 +1,6 @@ using KJD_Web.Model; using KJD_Web.Services; +using MAX.Core.Logger; using MySqlX.XDevAPI.Common; using System; using System.Collections.Generic; @@ -13,8 +14,9 @@ namespace KJD_Web.Controllers public class ImageCacheController : ApiController { private readonly ImageCacheService _imageCacheService; + private readonly ILoggerFacade _logger; - public ImageCacheController(ImageCacheService imageCacheService) + public ImageCacheController(ImageCacheService imageCacheService, ILoggerFacade logger) { if (imageCacheService == null) { @@ -22,6 +24,7 @@ namespace KJD_Web.Controllers } _imageCacheService = imageCacheService; + _logger = logger; } @@ -54,40 +57,43 @@ namespace KJD_Web.Controllers [HttpPost] public IHttpActionResult AddOrUpdate([FromBody] ImageCacheUpdateUrlRequest[] requests) { - try + if (requests == null || requests.Length == 0) { - if (requests == null) - { - throw new Exception("参数错误"); - } - foreach (var item in requests) + return Ok(ApiResult.Fail("参数不能为空")); + } + + var failedItems = new List(); + foreach (var item in requests) + { + try { if (!_imageCacheService.AddOrUpdate(item.Md5, item.Platform, item.PlatformUrl)) { - throw new Exception("操作失败"); + failedItems.Add(item.Md5); } } - - - return Ok(ApiResult.Success(true)); - } - catch (Exception ex) - { - return Ok(ApiResult.Fail(ex.Message)); + catch (Exception ex) + { + _logger.Error(ex, $"AddOrUpdate 失败, Md5={item.Md5}"); + failedItems.Add(item.Md5); + } } + + return failedItems.Count == 0 + ? Ok(ApiResult.Success(true)) + : Ok(ApiResult.Fail($"部分图片失败", data: failedItems)); + } + public class ImageCacheBatchQueryRequest + { + public List Md5s { get; set; } + public byte? Platform { get; set; } + } + + public class ImageCacheUpdateUrlRequest + { + public string Md5 { get; set; } + public byte Platform { get; set; } + public string PlatformUrl { get; set; } } } - - public class ImageCacheBatchQueryRequest - { - public List Md5s { get; set; } - public byte? Platform { get; set; } - } - - public class ImageCacheUpdateUrlRequest - { - public string Md5 { get; set; } - public byte Platform { get; set; } - public string PlatformUrl { get; set; } - } } \ No newline at end of file diff --git a/KJD_WebService/Core/Logger/ILoggerFacade.cs b/KJD_WebService/Core/Logger/ILoggerFacade.cs new file mode 100644 index 0000000..6c1d035 --- /dev/null +++ b/KJD_WebService/Core/Logger/ILoggerFacade.cs @@ -0,0 +1,69 @@ +using System; + +namespace MAX.Core.Logger +{ + /// + /// 日志操作 + /// + public interface ILoggerFacade + { + /// + /// 调试级别是否启用 + /// + bool IsDebugEnabled { get; } + + /// + /// 调试 + /// + void Debug(Exception ex, string message); + /// + /// 调试 + /// + /// 日志消息 + void Debug(string message); + /// + /// 信息 + /// + void Info(Exception ex, string message); + /// + /// 信息 + /// + /// 日志消息 + void Info(string message); + /// + /// 警告 + /// + void Warn(Exception ex, string message); + /// + /// 警告 + /// + /// 日志消息 + void Warn(string message); + /// + /// 错误 + /// + void Error(Exception ex, string message); + /// + /// 错误 + /// + /// 日志消息 + void Error(string message); + /// + /// 致命错误 + /// + void Fatal(Exception ex, string message); + /// + /// 致命错误 + /// + /// 日志消息 + void Fatal(string message); + void Error(Exception ex); + + /// + /// 写入日志 + /// + /// + /// + void Log(string message, LogLevel level); + } +} diff --git a/KJD_WebService/Core/Logger/LogLevel.cs b/KJD_WebService/Core/Logger/LogLevel.cs new file mode 100644 index 0000000..ead21f0 --- /dev/null +++ b/KJD_WebService/Core/Logger/LogLevel.cs @@ -0,0 +1,16 @@ +namespace MAX.Core.Logger +{ + /// + /// ÈÕ־µȼ¶ + /// + public enum LogLevel + { + Trace = 0, + Debug = 1, + Info = 2, + Warn = 3, + Error = 4, + Fatal = 5, + None = 6 + } +} \ No newline at end of file diff --git a/KJD_WebService/Core/Logger/NLogger.cs b/KJD_WebService/Core/Logger/NLogger.cs new file mode 100644 index 0000000..752936e --- /dev/null +++ b/KJD_WebService/Core/Logger/NLogger.cs @@ -0,0 +1,152 @@ +using MAX.Core.Logger; +using MySqlX.XDevAPI; +using NLog; +using System; +using LLogLevel = MAX.Core.Logger.LogLevel; +using NLogLevel = NLog.LogLevel; + +namespace MAX.Framework.Logger +{ + public class NLogger : ILoggerFacade + { + private static NLogger mySelf;//= default(T); + public static NLogger Instance + { + get + { + if (mySelf == null) + { + mySelf = new NLogger(); + } + + return mySelf; + } + } + private readonly ILogger _log; + + private NLogger() + { + _log = LogManager.GetCurrentClassLogger(); + } + + public bool IsDebugEnabled { get; private set; } = true; + + public void Debug(Exception ex, string message) + { + Execute(NLogLevel.Debug, ex, message); + } + + public void Debug(string message) + { + Execute(NLogLevel.Debug, message); + } + public void Error(Exception ex) + { + Execute(NLogLevel.Error, ex); + } + public void Error(Exception ex, string message) + { + Execute(NLogLevel.Error, ex, message); + } + + public void Error(string message) + { + Execute(NLogLevel.Error, message); + } + + public void Fatal(Exception ex, string message) + { + Execute(NLogLevel.Fatal, ex, message); + } + + public void Fatal(string message) + { + Execute(NLogLevel.Fatal, message); + } + + public void Info(Exception ex, string message) + { + Execute(NLogLevel.Info, ex, message); + } + + public void Info(string message) + { + Execute(NLogLevel.Info, message); + } + + public void Warn(Exception ex, string message) + { + Execute(NLogLevel.Warn, ex, message); + } + + public void Warn(string message) + { + Execute(NLogLevel.Warn, message); + } + public void Log(string message, LLogLevel level) + { + NLogLevel lv = NLogLevel.Info; + switch (level) + { + case LLogLevel.Trace: + lv = NLogLevel.Trace; + break; + case LLogLevel.Debug: + lv = NLogLevel.Debug; + break; + case LLogLevel.Info: + lv = NLogLevel.Info; + break; + case LLogLevel.Warn: + lv = NLogLevel.Warn; + break; + case LLogLevel.Error: + lv = NLogLevel.Error; + break; + case LLogLevel.Fatal: + lv = NLogLevel.Fatal; + break; + case LLogLevel.None: + lv = NLogLevel.Off; + break; + } + Execute(lv, message); + } + /// + /// 是否启用 + /// + private bool Enabled(NLogLevel level) + { + if (level > NLogLevel.Debug) + { + return true; + } + + return IsDebugEnabled; + } + + /// + /// 执行 + /// + private void Execute(NLogLevel level, Exception ex, string message = "") + { + if (Enabled(level)) + { + _log.Log(level, ex, message, null); + } + } + + + /// + /// 执行 + /// + private void Execute(NLogLevel level, string message) + { + if (Enabled(level)) + { + _log.Log(level, message); + } + } + + } +} diff --git a/KJD_WebService/Global.asax.cs b/KJD_WebService/Global.asax.cs index fba3140..a0613f3 100644 --- a/KJD_WebService/Global.asax.cs +++ b/KJD_WebService/Global.asax.cs @@ -2,12 +2,14 @@ using Autofac.Integration.WebApi; using FreeSql; using KJD_Web.Utils; -using MySql.Data.MySqlClient; using MAX.Core.DependencyInjection; +using MAX.Core.Logger; +using MAX.Framework.Logger; +using MySql.Data.MySqlClient; using NLog; using System; -using System.Configuration; using System.Collections.Generic; +using System.Configuration; using System.Linq; using System.Reflection; using System.Web; @@ -21,7 +23,7 @@ namespace KJD_Web { protected void Application_Start(object sender, EventArgs e) { - LogHelper.Info("应用程序启动"); + NLogger.Instance.Info("应用程序启动"); var container = BuildContainer(); // 让 Web API 用 Autofac 解析 Controller @@ -42,7 +44,7 @@ namespace KJD_Web // 注册 Web API 所有 Controller builder.RegisterApiControllers(appAssembly); - + builder.RegisterInstance(NLogger.Instance).As().SingleInstance(); #region 注册所有IOC接口 Type typeSingleton = typeof(ISingletonDependency); @@ -113,50 +115,50 @@ namespace KJD_Web string hPath = Request.Url.LocalPath.ToString(); //if (!hPath.Contains(".asmx") && hPath.Contains("/user/")) //{ - //hPath = hPath.Replace("/user/", "/UserService.asmx/"); - //Context.RewritePath(hPath); + //hPath = hPath.Replace("/user/", "/UserService.asmx/"); + //Context.RewritePath(hPath); //} //else if (!hPath.Contains(".asmx") && hPath.Contains("/shop/")) //{ - //hPath = hPath.Replace("/shop/", "/ShopService.asmx/"); - //Context.RewritePath(hPath); + //hPath = hPath.Replace("/shop/", "/ShopService.asmx/"); + //Context.RewritePath(hPath); //} //else if (!hPath.Contains(".asmx") && hPath.Contains("/update/")) //{ - //hPath = hPath.Replace("/update/", "/UpdateService.asmx/"); - //Context.RewritePath(hPath); + //hPath = hPath.Replace("/update/", "/UpdateService.asmx/"); + //Context.RewritePath(hPath); //} //else if (!hPath.Contains(".asmx") && hPath.Contains("/order/")) //{ - //hPath = hPath.Replace("/order/", "/OrderService.asmx/"); - //Context.RewritePath(hPath); + //hPath = hPath.Replace("/order/", "/OrderService.asmx/"); + //Context.RewritePath(hPath); //} //else if (!hPath.Contains(".asmx") && hPath.Contains("/product/")) //{ - //hPath = hPath.Replace("/product/", "/ProductService.asmx/"); - //Context.RewritePath(hPath); + //hPath = hPath.Replace("/product/", "/ProductService.asmx/"); + //Context.RewritePath(hPath); //} //else if (!hPath.Contains(".asmx") && hPath.Contains("/product_third/")) //{ - //hPath = hPath.Replace("/product_third/", "/ProductThirdService.asmx/"); - //Context.RewritePath(hPath); + //hPath = hPath.Replace("/product_third/", "/ProductThirdService.asmx/"); + //Context.RewritePath(hPath); //} //else if (!hPath.Contains(".asmx") && hPath.Contains("/price/")) //{ - //hPath = hPath.Replace("/price/", "/PriceService.asmx/"); - //Context.RewritePath(hPath); + //hPath = hPath.Replace("/price/", "/PriceService.asmx/"); + //Context.RewritePath(hPath); //} //if (!hPath.Contains(".asmx") && hPath.Contains("/bxx_user/")) //{ - //hPath = hPath.Replace("/bxx_user/", "/BXXUserService.asmx/"); - //Context.RewritePath(hPath); + //hPath = hPath.Replace("/bxx_user/", "/BXXUserService.asmx/"); + //Context.RewritePath(hPath); //} //else if (!hPath.Contains(".asmx") && hPath.Contains("/bxx_shop/")) //{ - //hPath = hPath.Replace("/bxx_shop/", "/BXXShopService.asmx/"); - //Context.RewritePath(hPath); + //hPath = hPath.Replace("/bxx_shop/", "/BXXShopService.asmx/"); + //Context.RewritePath(hPath); //} //else if (!hPath.Contains(".asmx") && hPath.Contains("/update/")) //{ @@ -165,30 +167,30 @@ namespace KJD_Web //} //else if (!hPath.Contains(".asmx") && hPath.Contains("/bxx_product/")) //{ - //hPath = hPath.Replace("/bxx_product/", "/BXXProductService.asmx/"); - //Context.RewritePath(hPath); + //hPath = hPath.Replace("/bxx_product/", "/BXXProductService.asmx/"); + //Context.RewritePath(hPath); //} //else if (!hPath.Contains(".asmx") && hPath.Contains("/bxx_product_third/")) //{ - //hPath = hPath.Replace("/bxx_product_third/", "/BXXProductThirdService.asmx/"); - //Context.RewritePath(hPath); + //hPath = hPath.Replace("/bxx_product_third/", "/BXXProductThirdService.asmx/"); + //Context.RewritePath(hPath); //} //else if (!hPath.Contains(".asmx") && hPath.Contains("/bxx_price/")) //{ - //hPath = hPath.Replace("/bxx_price/", "/BXXPriceService.asmx/"); - //Context.RewritePath(hPath); + //hPath = hPath.Replace("/bxx_price/", "/BXXPriceService.asmx/"); + //Context.RewritePath(hPath); //} //if (!hPath.Contains(".asmx") && hPath.Contains("/dyxd_user/")) //{ - //hPath = hPath.Replace("/dyxd_user/", "/DYUserService.asmx/"); - //Context.RewritePath(hPath); + //hPath = hPath.Replace("/dyxd_user/", "/DYUserService.asmx/"); + //Context.RewritePath(hPath); //} //else if (!hPath.Contains(".asmx") && hPath.Contains("/dyxd_shop/")) //{ - //hPath = hPath.Replace("/dyxd_shop/", "/DYShopService.asmx/"); - //Context.RewritePath(hPath); + //hPath = hPath.Replace("/dyxd_shop/", "/DYShopService.asmx/"); + //Context.RewritePath(hPath); //} //else if (!hPath.Contains(".asmx") && hPath.Contains("/update/")) //{ @@ -216,19 +218,19 @@ namespace KJD_Web //} //if (!hPath.Contains(".asmx") && hPath.Contains("/wxxd_product/")) //{ - //hPath = hPath.Replace("/wxxd_product/", "/WXProductService.asmx/"); - //Context.RewritePath(hPath); + //hPath = hPath.Replace("/wxxd_product/", "/WXProductService.asmx/"); + //Context.RewritePath(hPath); //} //else if (!hPath.Contains(".asmx") && hPath.Contains("/wxxd_order/")) //{ - //hPath = hPath.Replace("/wxxd_order/", "/WXOrderService.asmx/"); - //Context.RewritePath(hPath); + //hPath = hPath.Replace("/wxxd_order/", "/WXOrderService.asmx/"); + //Context.RewritePath(hPath); //} //else if (!hPath.Contains(".asmx") && hPath.Contains("/wxxd_shop_revenue_statistics/")) //{ - //hPath = hPath.Replace("/wxxd_shop_revenue_statistics/", "/WXShopRevenueStatistics.asmx/"); - //Context.RewritePath(hPath); + //hPath = hPath.Replace("/wxxd_shop_revenue_statistics/", "/WXShopRevenueStatistics.asmx/"); + //Context.RewritePath(hPath); //} // 请求录制:捕获请求链接与请求内容,用于迁移后的回放校验 //try { ApiRequestLogger.BeginRequest(Context); } catch { } diff --git a/KJD_WebService/KJD_WebService.csproj b/KJD_WebService/KJD_WebService.csproj index c5fca53..36f220f 100644 --- a/KJD_WebService/KJD_WebService.csproj +++ b/KJD_WebService/KJD_WebService.csproj @@ -26,16 +26,18 @@ - true - full - false - bin\ - DEBUG;TRACE - prompt - 4 - false + 12 + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + false + 12 true pdbonly true @@ -203,6 +205,9 @@ + + + diff --git a/KJD_WebService/LogHelper.cs b/KJD_WebService/LogHelper.cs index 181728f..a9a1803 100644 --- a/KJD_WebService/LogHelper.cs +++ b/KJD_WebService/LogHelper.cs @@ -1,80 +1,80 @@ -using System; -using NLog; +//using System; +//using NLog; -namespace KJD_Web -{ - public static class LogHelper - { - private static Logger _logger; +//namespace KJD_Web +//{ +// public static class LogHelper +// { +// private static Logger _logger; - // 静态构造函数,获取Logger实例 - static LogHelper() - { - _logger = LogManager.GetCurrentClassLogger(); - } +// // 静态构造函数,获取Logger实例 +// static LogHelper() +// { +// _logger = LogManager.GetCurrentClassLogger(); +// } - // 获取日志记录器 - public static Logger Logger - { - get { return _logger; } - } +// // 获取日志记录器 +// public static Logger Logger +// { +// get { return _logger; } +// } - // 便捷方法:记录信息 - public static void Info(string message, params object[] args) - { - _logger.Info(message, args); - } +// // 便捷方法:记录信息 +// public static void Info(string message, params object[] args) +// { +// _logger.Info(message, args); +// } - // 便捷方法:记录错误 - public static void Error(string message, params object[] args) - { - _logger.Error(message, args); - } +// // 便捷方法:记录错误 +// public static void Error(string message, params object[] args) +// { +// _logger.Error(message, args); +// } - // 便捷方法:记录错误(含异常) - public static void Error(Exception ex, string message = null, params object[] args) - { - if (string.IsNullOrEmpty(message)) - _logger.Error(ex); - else - _logger.Error(ex, message, args); - } +// // 便捷方法:记录错误(含异常) +// public static void Error(Exception ex, string message = null, params object[] args) +// { +// if (string.IsNullOrEmpty(message)) +// _logger.Error(ex); +// else +// _logger.Error(ex, message, args); +// } - // 便捷方法:记录警告 - public static void Warn(string message, params object[] args) - { - _logger.Warn(message, args); - } +// // 便捷方法:记录警告 +// public static void Warn(string message, params object[] args) +// { +// _logger.Warn(message, args); +// } - // 便捷方法:记录调试 - public static void Debug(string message, params object[] args) - { - _logger.Debug(message, args); - } +// // 便捷方法:记录调试 +// public static void Debug(string message, params object[] args) +// { +// _logger.Debug(message, args); +// } - // 便捷方法:记录跟踪 - public static void Trace(string message, params object[] args) - { - _logger.Trace(message, args); - } +// // 便捷方法:记录跟踪 +// public static void Trace(string message, params object[] args) +// { +// _logger.Trace(message, args); +// } - // 记录方法进入(用于方法调用跟踪) - public static void LogMethodEntry(string methodName, params object[] parameters) - { - if (_logger.IsTraceEnabled) - { - _logger.Trace("进入方法: {0} (参数: {1})", methodName, - string.Join(", ", parameters)); - } - } +// // 记录方法进入(用于方法调用跟踪) +// public static void LogMethodEntry(string methodName, params object[] parameters) +// { +// if (_logger.IsTraceEnabled) +// { +// _logger.Trace("进入方法: {0} (参数: {1})", methodName, +// string.Join(", ", parameters)); +// } +// } - // 记录方法退出 - public static void LogMethodExit(string methodName, object result = null) - { - if (_logger.IsTraceEnabled) - { - _logger.Trace("退出方法: {0} (返回值: {1})", methodName, result ?? "void"); - } - } - } -} \ No newline at end of file +// // 记录方法退出 +// public static void LogMethodExit(string methodName, object result = null) +// { +// if (_logger.IsTraceEnabled) +// { +// _logger.Trace("退出方法: {0} (返回值: {1})", methodName, result ?? "void"); +// } +// } +// } +//} \ No newline at end of file diff --git a/KJD_WebService/NotFoundMessageFilter.cs b/KJD_WebService/NotFoundMessageFilter.cs index 7d2249a..6fc8afd 100644 --- a/KJD_WebService/NotFoundMessageFilter.cs +++ b/KJD_WebService/NotFoundMessageFilter.cs @@ -1,5 +1,6 @@ using KJD_Web.Model; using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; using System; using System.Collections.Generic; using System.Linq; @@ -20,7 +21,7 @@ namespace KJD_Web if (actionExecutedContext.Response != null && actionExecutedContext.Response.StatusCode == HttpStatusCode.NotFound) { - + actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse( HttpStatusCode.NotFound, ApiResult.Fail("请求失败", ResultCode.NotFound)); @@ -38,9 +39,14 @@ namespace KJD_Web if (response.StatusCode != HttpStatusCode.OK) { response.Content = new StringContent( - JsonConvert.SerializeObject(ApiResult.Fail("请求失败", ResultCode.NotFound)), - Encoding.UTF8, - "application/json"); + JsonConvert.SerializeObject( + ApiResult.Fail("请求失败", ResultCode.NotFound), + new JsonSerializerSettings + { + ContractResolver = new CamelCasePropertyNamesContractResolver() + }), + Encoding.UTF8, + "application/json"); } return response; diff --git a/KJD_WebService/Properties/PublishProfiles/FolderProfile.pubxml b/KJD_WebService/Properties/PublishProfiles/FolderProfile.pubxml new file mode 100644 index 0000000..790bbf3 --- /dev/null +++ b/KJD_WebService/Properties/PublishProfiles/FolderProfile.pubxml @@ -0,0 +1,15 @@ + + + + + false + false + true + Release + Any CPU + FileSystem + bin\app.publish\ + FileSystem + <_TargetId>Folder + + \ No newline at end of file diff --git a/KJD_WebService/Services/ImageCacheService.cs b/KJD_WebService/Services/ImageCacheService.cs index cfb5710..e065d0f 100644 --- a/KJD_WebService/Services/ImageCacheService.cs +++ b/KJD_WebService/Services/ImageCacheService.cs @@ -1,6 +1,7 @@ using FreeSql; using FreeSql.DataAnnotations; using MAX.Core.DependencyInjection; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; @@ -10,21 +11,23 @@ namespace KJD_Web.Services [Table(Name = "images_0")] public class ImageCacheEntity { + [JsonIgnore] [Column(Name = "id", IsIdentity = true, IsPrimary = true)] public long id { get; set; } [Column(Name = "platform")] public byte platform { get; set; } + [JsonProperty("md5")] [Column(Name = "source_url_md5", StringLength = 32)] public string source_url_md5 { get; set; } [Column(Name = "platform_url", StringLength = 1000)] public string platform_url { get; set; } - + [JsonIgnore] [Column(Name = "create_time")] public DateTime create_time { get; set; } - + [JsonIgnore] [Column(Name = "update_time")] public DateTime update_time { get; set; } } diff --git a/KJD_WebService/Web.config b/KJD_WebService/Web.config index 91a0d5b..4759219 100644 --- a/KJD_WebService/Web.config +++ b/KJD_WebService/Web.config @@ -6,7 +6,7 @@ - + diff --git a/KJD_WebService/WebApiConfig.cs b/KJD_WebService/WebApiConfig.cs index 8db1199..c57fb86 100644 --- a/KJD_WebService/WebApiConfig.cs +++ b/KJD_WebService/WebApiConfig.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json.Serialization; +using System; using System.Collections.Generic; using System.Linq; using System.Web; @@ -23,10 +24,15 @@ namespace KJD_Web routeTemplate: "{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); + + var jsonFormatter = config.Formatters.JsonFormatter; + jsonFormatter.SerializerSettings.ContractResolver = + new CamelCasePropertyNamesContractResolver(); + config.Formatters.Remove(config.Formatters.XmlFormatter); config.Filters.Add(new NotFoundMessageFilter()); config.MessageHandlers.Add(new NotFoundMessageHandler()); - + } } } \ No newline at end of file