浏览代码

2020/04/15
Actions:
1. Add ApiLog Feature

Jessica.Tseng 5 年之前
父节点
当前提交
a95712772e

+ 3 - 0
EVCB_OCPP.WEBAPI/App_Start/WebApiConfig.cs

@@ -4,6 +4,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Web.Http;
 using System.Web.Http.ExceptionHandling;
+using static EVCB_OCPP.WEBAPI.Handlers.APILogHandler;
 
 namespace EVCB_OCPP.WEBAPI
 {
@@ -11,6 +12,8 @@ namespace EVCB_OCPP.WEBAPI
     {
         public static void Register(HttpConfiguration config)
         {
+
+            config.MessageHandlers.Add(new ApiLogHandler());
             // Web API 設定和服務
             config.Services.Replace(typeof(IExceptionHandler), new GlobalExceptionHandler());
             // Web API 路由

+ 1 - 1
EVCB_OCPP.WEBAPI/Controllers/Version1/CPOController.cs

@@ -1053,7 +1053,7 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
         {
             CPOOuterResponse result = new CPOOuterResponse();
 
-            result.ErrorDetail = innerResponse.Exception == null ? string.Empty : innerResponse.Exception.ToString();
+            result.ErrorDetail = innerResponse.Exception == null ? null : innerResponse.Exception.ToString();
 
             if (innerResponse.Status != HttpStatusCode.Accepted)
             {

+ 78 - 28
EVCB_OCPP.WEBAPI/Controllers/Version1/InternalController.cs

@@ -69,7 +69,8 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
                 return Request.CreateResponse(HttpStatusCode.BadRequest, new ErrorResponse()
                 {
                     Code = 2999,
-                    Message = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR, "CommandofExecution", ex.ToString())
+                    Message = EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR,
+                    ErrorDetail = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, "CommandofExecution", ex.ToString())
                 });
             }
 
@@ -129,7 +130,9 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
                 return Request.CreateResponse(HttpStatusCode.BadRequest, new ErrorResponse()
                 {
                     Code = 2999,
-                    Message = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR, "Availability", ex.ToString())
+                    Message = EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR,
+                    ErrorDetail = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, "Availability", ex.ToString())
+                   
                 });
             }
 
@@ -188,7 +191,9 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
                 return Request.CreateResponse(HttpStatusCode.BadRequest, new ErrorResponse()
                 {
                     Code = 2999,
-                    Message = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR, "ChangeConfiguration", ex.ToString())
+                    Message = EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR,
+                    ErrorDetail = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, "ChangeConfiguration", ex.ToString())
+                   
                 });
             }
 
@@ -206,6 +211,7 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
             HttpStatusCode statusCode = HttpStatusCode.InternalServerError;
             try
             {
+
                 //Does charge exist ? 
                 ChargePointService chargePointService = new ChargePointService();
 
@@ -243,7 +249,9 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
                 return Request.CreateResponse(HttpStatusCode.BadRequest, new ErrorResponse()
                 {
                     Code = 2999,
-                    Message = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR, "GetConfiguration", ex.ToString())
+                    Message = EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR,
+                    ErrorDetail = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, "GetConfiguration", ex.ToString())
+                   
                 });
             }
 
@@ -307,7 +315,9 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
                 return Request.CreateResponse(HttpStatusCode.BadRequest, new ErrorResponse()
                 {
                     Code = 2999,
-                    Message = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR, "GetDiagonostics", ex.ToString())
+                    Message = EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR,
+                    ErrorDetail = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, "GetDiagonostics", ex.ToString())
+                   
                 });
             }
 
@@ -346,8 +356,15 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
             }
             catch (Exception ex)
             {
+                return Request.CreateResponse(HttpStatusCode.BadRequest, new ErrorResponse()
+                {
+                    Code = 2999,
+                    Message = EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR,
+                    ErrorDetail = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, "GetLocallistversion", ex.ToString())
 
-                return Request.CreateResponse(HttpStatusCode.BadRequest, new ErrorResponse() { Code = 2999, Message = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR, "GetLocallistversion", ex.ToString()) });
+                });
+
+              
             }
 
             return Request.CreateResponse(statusCode, result);
@@ -457,12 +474,14 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
             }
             catch (Exception ex)
             {
-
                 return Request.CreateResponse(HttpStatusCode.BadRequest, new ErrorResponse()
                 {
                     Code = 2999,
-                    Message = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR, "StopTransaction", ex.ToString())
+                    Message = EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR,
+                    ErrorDetail = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, "StartTransaction", ex.ToString())
+
                 });
+               
             }
 
             return Request.CreateResponse(statusCode, result);
@@ -522,12 +541,15 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
             }
             catch (Exception ex)
             {
-
-                return Request.CreateResponse(HttpStatusCode.InternalServerError, new ErrorResponse()
+                return Request.CreateResponse(HttpStatusCode.BadRequest, new ErrorResponse()
                 {
                     Code = 2999,
-                    Message = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR, "StopTransaction", ex.ToString())
+                    Message = EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR,
+                    ErrorDetail = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, "StopTransaction", ex.ToString())
+
                 });
+
+               
             }
 
 
@@ -606,12 +628,16 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
             }
             catch (Exception ex)
             {
-
                 return Request.CreateResponse(HttpStatusCode.BadRequest, new ErrorResponse()
                 {
                     Code = 2999,
-                    Message = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR, "ReserveNow", ex.ToString())
+                    Message = EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR,
+                    ErrorDetail = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, "ReserveNow", ex.ToString())
+
                 });
+
+
+              
             }
 
             return Request.CreateResponse(statusCode, result);
@@ -665,12 +691,14 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
             }
             catch (Exception ex)
             {
-
                 return Request.CreateResponse(HttpStatusCode.BadRequest, new ErrorResponse()
                 {
                     Code = 2999,
-                    Message = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR, "CancelResrvation", ex.ToString())
+                    Message = EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR,
+                    ErrorDetail = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, "CancelResrvation", ex.ToString())
+
                 });
+              
             }
 
             return Request.CreateResponse(statusCode, result);
@@ -724,12 +752,14 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
             }
             catch (Exception ex)
             {
-
                 return Request.CreateResponse(HttpStatusCode.BadRequest, new ErrorResponse()
                 {
                     Code = 2999,
-                    Message = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR, "Reset", ex.ToString())
+                    Message = EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR,
+                    ErrorDetail = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, "Reset", ex.ToString())
+
                 });
+             
             }
 
             return Request.CreateResponse(statusCode, result);
@@ -808,12 +838,14 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
             }
             catch (Exception ex)
             {
-
                 return Request.CreateResponse(HttpStatusCode.BadRequest, new ErrorResponse()
                 {
                     Code = 2999,
-                    Message = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR, "ClearCache", ex.ToString())
+                    Message = EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR,
+                    ErrorDetail = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, "SendLocalList", ex.ToString())
+
                 });
+              
             }
 
             return Request.CreateResponse(statusCode, result);
@@ -861,12 +893,14 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
             }
             catch (Exception ex)
             {
-
                 return Request.CreateResponse(HttpStatusCode.BadRequest, new ErrorResponse()
                 {
                     Code = 2999,
-                    Message = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR, "ClearCache", ex.ToString())
+                    Message = EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR,
+                    ErrorDetail = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, "ClearCache", ex.ToString())
+
                 });
+                
             }
 
             return Request.CreateResponse(statusCode, result);
@@ -945,7 +979,9 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
                 return Request.CreateResponse(HttpStatusCode.BadRequest, new ErrorResponse()
                 {
                     Code = 2999,
-                    Message = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR, "StopTransaction", ex.ToString())
+                    Message = EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR,
+                    ErrorDetail = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, "SetChargingProfile", ex.ToString())
+
                 });
             }
 
@@ -1002,10 +1038,13 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
             catch (Exception ex)
             {
 
+              
                 return Request.CreateResponse(HttpStatusCode.BadRequest, new ErrorResponse()
                 {
                     Code = 2999,
-                    Message = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR, "ClearChargingProfile", ex.ToString())
+                    Message = EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR,
+                    ErrorDetail = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, "ClearChargingProfile", ex.ToString())
+
                 });
             }
 
@@ -1058,12 +1097,14 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
             }
             catch (Exception ex)
             {
-
                 return Request.CreateResponse(HttpStatusCode.BadRequest, new ErrorResponse()
                 {
                     Code = 2999,
-                    Message = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR, "TriggerMessage", ex.ToString())
+                    Message = EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR,
+                    ErrorDetail = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, "TriggerMessage", ex.ToString())
+
                 });
+               
             }
 
             return Request.CreateResponse(statusCode, result);
@@ -1114,12 +1155,15 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
             }
             catch (Exception ex)
             {
-
                 return Request.CreateResponse(HttpStatusCode.BadRequest, new ErrorResponse()
                 {
                     Code = 2999,
-                    Message = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR, "UnlockConnector", ex.ToString())
+                    Message = EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR,
+                    ErrorDetail = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, "UnlockConnector", ex.ToString())
+
                 });
+
+               
             }
 
             return Request.CreateResponse(statusCode, result);
@@ -1176,8 +1220,14 @@ namespace EVCB_OCPP.WEBAPI.Controllers.Version1
             }
             catch (Exception ex)
             {
+                return Request.CreateResponse(HttpStatusCode.BadRequest, new ErrorResponse()
+                {
+                    Code = 2999,
+                    Message = EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR,
+                    ErrorDetail = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, "CompositeSchedule", ex.ToString())
 
-                return Request.CreateResponse(HttpStatusCode.BadRequest, new ErrorResponse() { Code = 2999, Message = string.Format(EVCBConfiguration.ERRORMESSAGE_FORMAT, EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR, "GetLocallistversion", ex.ToString()) });
+                });
+               
             }
 
             return Request.CreateResponse(statusCode, result);

+ 1 - 1
EVCB_OCPP.WEBAPI/EVCBConfiguration.cs

@@ -19,7 +19,7 @@ namespace EVCB_OCPP.WEBAPI
         public static readonly string UTC_DATETIMEFORMAT = "yyyy/MM/dd'T'HH':'mm':'ss'Z'";
 
 
-        public static readonly string ERRORMESSAGE_FORMAT = "{0}/{1}/{2}";
+        public static readonly string ERRORMESSAGE_FORMAT = "{0}:{1}";
 
         public static readonly DateTime DefaultTime = new DateTime(627982848000000000, DateTimeKind.Utc);
 

+ 2 - 0
EVCB_OCPP.WEBAPI/EVCB_OCPP.WEBAPI.csproj

@@ -226,6 +226,8 @@
     <Compile Include="Handlers\CPOAuthentication.cs" />
     <Compile Include="Handlers\GlobalExceptionHandler .cs" />
     <Compile Include="Handlers\InernalAuthentication.cs" />
+    <Compile Include="Helpers\WebApiHelper.cs" />
+    <Compile Include="Models\ApiLogEntry.cs" />
     <Compile Include="Models\ConnectorMeterValue.cs" />
     <Compile Include="Models\ConnectorMeterValueModel.cs" />
     <Compile Include="Models\SessionDetail.cs" />

+ 10 - 1
EVCB_OCPP.WEBAPI/Global.asax.cs

@@ -1,4 +1,5 @@
-using System;
+using Newtonsoft.Json;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Web;
@@ -18,6 +19,14 @@ namespace EVCB_OCPP.WEBAPI
             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
             RouteConfig.RegisterRoutes(RouteTable.Routes);
             BundleConfig.RegisterBundles(BundleTable.Bundles);
+
+
+            var formatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
+            formatter.SerializerSettings = new JsonSerializerSettings
+            {
+               
+                NullValueHandling = NullValueHandling.Ignore
+            };
         }
 
      

+ 136 - 92
EVCB_OCPP.WEBAPI/Handlers/APILogHandler.cs

@@ -1,6 +1,10 @@
-using EVCB_OCPP.WEBAPI.Models.WebAPI;
+using EVCB_OCPP.WEBAPI.Helpers;
+using EVCB_OCPP.WEBAPI.Models;
+using EVCB_OCPP.WEBAPI.Models.WebAPI;
+using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
+using System.Data.SqlClient;
 using System.Linq;
 using System.Net;
 using System.Net.Http;
@@ -15,130 +19,170 @@ namespace EVCB_OCPP.WEBAPI.Handlers
         public class ApiLogHandler : DelegatingHandler
         {
             //   private NLog.ILogger logger = LogManager.GetCurrentClassLogger();
-         //   private string portal_connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ProtalConnection"].ConnectionString;
+            private string apiLogConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["APILogDBContext"].ConnectionString;
+
 
-               
 
             protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
             {
                 string uri = request.RequestUri.ToString();
 
+                var apiLogEntry = CreateApiLogEntryWithRequestData(request);
 
                 if (request.Content != null)
                 {
                     await request.Content.ReadAsStringAsync()
                         .ContinueWith(task =>
                         {
+                            apiLogEntry.RequestContentBody = task.Result;
 
-                            //  apiLogEntry.RequestContentBody = task.Result;
                         }, cancellationToken);
                 }
 
 
                 return await base.SendAsync(request, cancellationToken)
                     .ContinueWith(task =>
-                    {
-                        //Guid id = Guid.NewGuid();
+                    {                      
 
                         var response = task.Result;
 
-                        // Update the API log entry with response info
-                        if (response.StatusCode == System.Net.HttpStatusCode.InternalServerError)
+                        if (response.Content != null)
                         {
-                            var result = new ErrorResponse {  Message = EVCBConfiguration.ERROR_MSG_UNEXPECTEDERROR };
-                            response = request.CreateResponse(HttpStatusCode.InternalServerError, result);
-                            //apiLogEntry.ErrorOn = DateTime.Now;
-                            //apiLogEntry.ErrorMsg = response.Content.ReadAsStringAsync().Result;
-
-                            //if (response.Content != null)
-                            //{
+                            apiLogEntry.ResponseContentBody = response.Content.ReadAsStringAsync().Result;
+                            apiLogEntry.ResponseContentType = response.Content.Headers.ContentType.MediaType;
+                            apiLogEntry.ResponseHeaders = WebApiHelper.SerializeHeaders(response.Content.Headers);
+                        }
 
-                            //    apiLogEntry.ResponseContentBody = response.Content.ReadAsStringAsync().Result;
-                            //    apiLogEntry.ResponseContentType = response.Content.Headers.ContentType.MediaType;
-                            //    apiLogEntry.ResponseHeaders = WebApiHelper.SerializeHeaders(response.Content.Headers);
-                            //}
+                        int errorMessageIndex = apiLogEntry.ResponseContentBody.IndexOf(",\"ErrorDetail\"");
+                        string endTag = apiLogEntry.ResponseContentBody.Last().ToString();
 
-                        }
-                        else
+                        if (errorMessageIndex > 0)
                         {
-                            //if (response.Content != null)
-                            //{
-
-                            //    apiLogEntry.ResponseContentBody = response.Content.ReadAsStringAsync().Result;
-                            //    apiLogEntry.ResponseContentType = response.Content.Headers.ContentType.MediaType;
-                            //    apiLogEntry.ResponseHeaders = WebApiHelper.SerializeHeaders(response.Content.Headers);
-                            //}
+                            string errorMsg = apiLogEntry.ResponseContentBody.Substring(errorMessageIndex).Remove(0, 16);
+                            apiLogEntry.ResponseContentBody = apiLogEntry.ResponseContentBody.Remove(errorMessageIndex).Remove(0, 1);
+                            apiLogEntry.ErrorOn = DateTime.Now;
+                            apiLogEntry.ErrorMsg = errorMsg.Remove(errorMsg.Count() - 2).Replace("'"," ");
+                           
+                            response = request.CreateResponse(response.StatusCode, JsonConvert.DeserializeObject("{" + apiLogEntry.ResponseContentBody + "}"));
                         }
-                        //    apiLogEntry.ResponseStatusCode = (int)response.StatusCode;
-                        //    apiLogEntry.ResponseTimestamp = DateTime.Now;
 
-                        //// TODO: Save the API log entry to the database
-
-                        //db.ApiLogEntry.Add(apiLogEntry);
-                        //    db.SaveChanges();
+                        apiLogEntry.ResponseStatusCode = (int)response.StatusCode;
+                        apiLogEntry.ResponseTimestamp = DateTime.Now;
+                        WriteLog(apiLogEntry);
 
                         return response;
                     }, cancellationToken);
             }
 
-            //private ApiLogEntry CreateApiLogEntryWithRequestData(HttpRequestMessage request)
-            //{
-            //    try
-            //    {
-            //        var context = ((HttpContextBase)request.Properties["MS_HttpContext"]);
-            //        var routeData = request.GetRouteData();
-
-            //        return new ApiLogEntry
-            //        {
-            //            Application = "[Api]",
-            //            User = context.User.Identity.Name,
-            //            Machine = Environment.MachineName,
-            //            RequestContentType = context.Request.ContentType,
-            //            RequestRouteTemplate = routeData.Route.RouteTemplate,
-            //            RequestRouteData = WebApiHelper.SerializeRouteData(routeData),
-            //            RequestIpAddress = context.Request.UserHostAddress,
-            //            RequestMethod = request.Method.Method,
-            //            RequestHeaders = WebApiHelper.SerializeHeaders(request.Headers),
-            //            RequestTimestamp = DateTime.Now,
-            //            RequestUri = request.RequestUri.ToString()
-            //        };
-            //    }
-            //    catch (Exception ex)
-            //    {
-            //        logger.Debug(" " + ex.ToString());
-            //        return null;
-            //    }
-
-            //}
-
-            //private ApiLogEntry CreateApiLogEntryWithRequestData_Temp(HttpRequestMessage request)
-            //{
-            //    try
-            //    {
-            //        var context = ((HttpContextBase)request.Properties["MS_HttpContext"]);
-            //        var routeData = request.GetRouteData();
-
-            //        return new ApiLogEntry
-            //        {
-            //            Application = "[Api]",
-            //            User = context.User.Identity.Name,
-            //            Machine = Environment.MachineName,
-            //            RequestContentType = context.Request.ContentType,
-            //            RequestRouteTemplate = routeData.Route.RouteTemplate,
-            //            RequestIpAddress = context.Request.UserHostAddress,
-            //            RequestMethod = request.Method.Method,
-            //            RequestHeaders = WebApiHelper.SerializeHeaders(request.Headers),
-            //            RequestTimestamp = DateTime.Now,
-            //            RequestUri = request.RequestUri.ToString()
-            //        };
-            //    }
-            //    catch (Exception ex)
-            //    {
-            //        logger.Debug("11111 " + ex.ToString());
-            //        return null;
-            //    }
-
-            //}
+            private ApiLogEntry CreateApiLogEntryWithRequestData(HttpRequestMessage request)
+            {
+                try
+                {
+                    var context = ((HttpContextBase)request.Properties["MS_HttpContext"]);
+                    var routeData = request.GetRouteData();
+
+                    return new ApiLogEntry
+                    {
+                        Application = "[Api]",
+                        User = context.User.Identity.Name,
+                        Machine = Environment.MachineName,
+                        RequestContentType = context.Request.ContentType,
+                        RequestRouteTemplate = routeData.Route.RouteTemplate,
+                        RequestRouteData = "",
+                        RequestIpAddress = context.Request.UserHostAddress,
+                        RequestMethod = request.Method.Method,
+                        RequestHeaders = WebApiHelper.SerializeHeaders(request.Headers),
+                        RequestTimestamp = DateTime.Now,
+                        RequestUri = request.RequestUri.ToString()
+                    };
+                }
+                catch (Exception ex)
+                {
+                    //  logger.Debug(" " + ex.ToString());
+                    return null;
+                }
+
+            }
+
+            private ApiLogEntry CreateApiLogEntryWithRequestData_Temp(HttpRequestMessage request)
+            {
+                try
+                {
+                    var context = ((HttpContextBase)request.Properties["MS_HttpContext"]);
+                    var routeData = request.GetRouteData();
+
+                    return new ApiLogEntry
+                    {
+                        Application = "[Api]",
+                        User = context.User.Identity.Name,
+                        Machine = Environment.MachineName,
+                        RequestContentType = context.Request.ContentType,
+                        RequestRouteTemplate = routeData.Route.RouteTemplate,
+                        RequestIpAddress = context.Request.UserHostAddress,
+                        RequestMethod = request.Method.Method,
+                        RequestHeaders = WebApiHelper.SerializeHeaders(request.Headers),
+                        RequestTimestamp = DateTime.Now,
+                        RequestUri = request.RequestUri.ToString()
+                    };
+                }
+                catch (Exception ex)
+                {
+                    // logger.Debug("11111 " + ex.ToString());
+                    return null;
+                }
+
+            }
+
+            private void WriteLog(ApiLogEntry log)
+            {
+                try
+                {
+
+                    if (log == null) return;
+                    using (var conn = new SqlConnection(apiLogConnectionString))
+                    {
+                        conn.Open();
+
+                        using (var cmd = new SqlCommand("[dbo].[uspInsertApiLog]", conn))
+                        {
+
+                            cmd.CommandType = System.Data.CommandType.StoredProcedure;
+                            cmd.Parameters.Add(new SqlParameter("Application", log.Application));
+                            cmd.Parameters.Add(new SqlParameter("User", log.User));
+                            cmd.Parameters.Add(new SqlParameter("Machine", log.Machine));
+                            cmd.Parameters.Add(new SqlParameter("RequestIpAddress", log.RequestIpAddress));
+                            cmd.Parameters.Add(new SqlParameter("RequestContentType", log.RequestContentType));
+                            cmd.Parameters.Add(new SqlParameter("RequestUri", log.RequestUri));
+                            cmd.Parameters.Add(new SqlParameter("RequestMethod", log.RequestMethod));
+                            cmd.Parameters.Add(new SqlParameter("RequestRouteTemplate", log.RequestRouteTemplate));
+                            cmd.Parameters.Add(new SqlParameter("RequestRouteData", ""));//log.RequestRouteData
+                            cmd.Parameters.Add(new SqlParameter("RequestHeaders", log.RequestHeaders));
+                            cmd.Parameters.Add(new SqlParameter("RequestTimestamp", log.RequestTimestamp));
+
+                            cmd.Parameters.Add(new SqlParameter("ResponseContentType", log.ResponseContentType));
+                            cmd.Parameters.Add(new SqlParameter("ResponseStatusCode", log.ResponseStatusCode));
+                            cmd.Parameters.Add(new SqlParameter("ResponseHeaders", log.ResponseHeaders));
+                            cmd.Parameters.Add(new SqlParameter("ResponseTimestamp", log.ResponseTimestamp));
+
+                            cmd.Parameters.Add(new SqlParameter("IsOutData", log.IsOutData));
+                            cmd.Parameters.Add(new SqlParameter("ErrorMsg", log.ErrorMsg));
+                            cmd.Parameters.Add(new SqlParameter("ErrorOn", log.ErrorOn));
+                            cmd.Parameters.Add(new SqlParameter("RequestContentBody", log.RequestContentBody));
+                            cmd.Parameters.Add(new SqlParameter("ResponseContentBody", log.ResponseContentBody));
+
+                            cmd.ExecuteNonQuery();
+                        }
+                    }
+
+
+                }
+                catch (Exception ex)
+                {
+                    Console.WriteLine(ex.ToString());
+                }
+
+
+            }
         }
     }
 }

+ 32 - 3
EVCB_OCPP.WEBAPI/Handlers/GlobalExceptionHandler .cs

@@ -1,21 +1,50 @@
-using System;
+using EVCB_OCPP.WEBAPI.Models.WebAPI;
+using Newtonsoft.Json;
+using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Net;
+using System.Net.Http;
+using System.Threading;
+using System.Threading.Tasks;
 using System.Web;
+using System.Web.Http;
 using System.Web.Http.ExceptionHandling;
 
 namespace EVCB_OCPP.WEBAPI.Handlers
 {
     public class GlobalExceptionHandler: ExceptionHandler
     {
+        
+
         public override void Handle(ExceptionHandlerContext context)
         {
-            if(ShouldHandle(context))
+           
+            if (ShouldHandle(context))
             {
-
+            
+                context.Result = new TextPlainErrorResult() { Request = context.Request  };
             }
         }
 
+
+        private class TextPlainErrorResult : IHttpActionResult
+        {
+            public HttpRequestMessage Request { get; set; }
+
       
+
+            public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
+            {
+                var result = new CPOOuterResponse() {  StatusMessage = CPO_StatusMessage.ERROR_MSG_Global_UNEXPECTEDERROR, StatusCode = (int)CPO_StatusCode.UnexpectedError };
+
+                var resultString = JsonConvert.SerializeObject(result,EVCBConfiguration.JSONSERIALIZER_FORMAT);
+                HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.InternalServerError, result);                                
+                response.RequestMessage = Request;
+                return Task.FromResult(response);
+            }
+        }
+
+
     }
 }

+ 43 - 0
EVCB_OCPP.WEBAPI/Helpers/WebApiHelper.cs

@@ -0,0 +1,43 @@
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Http.Headers;
+using System.Web;
+using System.Web.Http.Routing;
+
+namespace EVCB_OCPP.WEBAPI.Helpers
+{
+    public class WebApiHelper
+    {
+        public static string SerializeRouteData(IHttpRouteData routeData)
+        {
+            return JsonConvert.SerializeObject(routeData, Formatting.Indented, new JsonSerializerSettings()
+            {
+                ReferenceLoopHandling = ReferenceLoopHandling.Ignore
+            });
+        }
+        public static string SerializeHeaders(HttpHeaders headers)
+        {
+            var dict = new Dictionary<string, string>();
+
+            foreach (var item in headers.ToList())
+            {
+                if (item.Value != null)
+                {
+                    var header = String.Empty;
+                    foreach (var value in item.Value)
+                    {
+                        header += value + " ";
+                    }
+
+                    // Trim the trailing space and add item to the dictionary
+                    header = header.TrimEnd(" ".ToCharArray());
+                    dict.Add(item.Key, header);
+                }
+            }
+
+            return JsonConvert.SerializeObject(dict);
+        }
+    }
+}

+ 123 - 0
EVCB_OCPP.WEBAPI/Models/ApiLogEntry.cs

@@ -0,0 +1,123 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+
+namespace EVCB_OCPP.WEBAPI.Models
+{
+
+    public class ApiLogEntry
+    {
+
+        public ApiLogEntry()
+        {
+            ErrorOn = EVCBConfiguration.DefaultTime;
+            ErrorMsg = string.Empty;
+        }
+        /// <summary>
+        /// // The (database) ID for the API log entry.
+        /// </summary>
+        public long ApiLogEntryId { get; set; }
+
+        /// <summary>
+        /// The application that made the request.
+        /// </summary>
+        public string Application { get; set; }
+
+        /// <summary>
+        /// The user that made the request.
+        /// </summary>
+        public string User { get; set; }
+
+        /// <summary>
+        /// The machine that made the request.
+        /// </summary>
+        public string Machine { get; set; }
+
+        /// <summary>
+        /// The IP address that made the request.
+        /// </summary>
+        public string RequestIpAddress { get; set; }
+
+        /// <summary>
+        /// The request content type.
+        /// </summary>
+        public string RequestContentType { get; set; }
+
+        /// <summary>
+        /// The request content body.
+        /// </summary>
+        public string RequestContentBody { get; set; }
+
+        /// <summary>
+        /// The request URI.
+        /// </summary>
+        public string RequestUri { get; set; }
+
+        /// <summary>
+        /// The request method (GET, POST, etc).
+        /// </summary>
+
+        public string RequestMethod { get; set; }
+
+        /// <summary>
+        /// // The request route template.
+        /// </summary>
+        public string RequestRouteTemplate { get; set; }
+
+        /// <summary>
+        /// // The request route data.
+        /// </summary>
+        public string RequestRouteData { get; set; }
+
+        /// <summary>
+        /// The request headers.
+        /// </summary>
+        public string RequestHeaders { get; set; }
+
+        /// <summary>
+        /// // The request timestamp.
+        /// </summary>            
+        public DateTime? RequestTimestamp { get; set; }
+
+        /// <summary>
+        /// The response content type.
+        /// </summary>
+        public string ResponseContentType { get; set; }
+
+        /// <summary>
+        /// The response content body.
+        /// </summary>
+        public string ResponseContentBody { get; set; }
+
+        /// <summary>
+        /// The response status code.
+        /// </summary>
+        public int? ResponseStatusCode { get; set; }
+
+        /// <summary>
+        /// The response headers.
+        /// </summary>
+        public string ResponseHeaders { get; set; }
+
+        /// <summary>
+        /// The response timestamp.
+        /// </summary>
+        public DateTime? ResponseTimestamp { get; set; }
+
+        /// <summary>
+        /// 從server丟出去的請求
+        /// </summary>
+        public bool IsOutData { get; set; }
+
+        /// <summary>
+        /// 錯誤訊息
+        /// </summary>
+        public string ErrorMsg { get; set; }
+
+        /// <summary>
+        /// 錯誤時間
+        /// </summary>
+        public DateTime? ErrorOn { get; set; }
+    }
+}

+ 3 - 1
EVCB_OCPP.WEBAPI/Models/WebAPI/CPOOuterResponse.cs

@@ -11,6 +11,7 @@ namespace EVCB_OCPP.WEBAPI.Models.WebAPI
         public CPOOuterResponse()
         {
             StatusCode = (int)CPO_StatusCode.NoAction;
+          
         }
 
         public int StatusCode { set; get; }
@@ -22,7 +23,8 @@ namespace EVCB_OCPP.WEBAPI.Models.WebAPI
         [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
         public string SerialNo { set; get; }
 
-        [JsonIgnore]
+
+        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
         public string ErrorDetail { set; get; }
 
 

+ 1 - 0
EVCB_OCPP.WEBAPI/Models/WebAPI/CPOResponseDescription.cs

@@ -31,6 +31,7 @@ namespace EVCB_OCPP.WEBAPI.Models.WebAPI
         public static readonly string ERROR_MSG_INVALIDHEADER = "Invaild Headers";
         public static readonly string ERROR_MSG_INVALIDTIMESTAMP = "Invaild Timestamp";
         public static readonly string ERROR_MSG_INVALIDSIGNATURE = "Invaild Signature";
+        public static readonly string ERROR_MSG_Global_UNEXPECTEDERROR = "Global Unexpected Error";
         public static readonly string ERROR_MSG_UNEXPECTEDERROR = "Unexpected Error";
         public static readonly string ERROR_MSG_PARAMETER_OUTOFRANGE_INCORRECT = "Parameter is out of range or incorrect.";
         public static readonly string ERROR_MSG_CHARGEBOXID_ISNT_EXIST_OR_OFFLINE = "ChargeBoxId isn't exist or offline.";

+ 2 - 0
EVCB_OCPP.WEBAPI/Models/WebAPI/ErrorResponse.cs

@@ -11,5 +11,7 @@ namespace EVCB_OCPP.WEBAPI.Models.WebAPI
         public int Code { set; get; }
 
         public string Message { set; get; }
+
+        public string ErrorDetail { set; get; }
     }
 }

+ 2 - 2
EVCB_OCPP.WEBAPI/Services/ServerTriggerService.cs

@@ -112,7 +112,7 @@ namespace EVCB_OCPP.WEBAPI.Services
             parameters.Add("@ChargeBoxId", ChargeBoxId, DbType.String, ParameterDirection.Input);
             parameters.Add("@RequestType", 1, DbType.Int32, ParameterDirection.Input);
             parameters.Add("@RequestContent", JsonConvert.SerializeObject(request, EVCBConfiguration.JSONSERIALIZER_FORMAT), DbType.String, ParameterDirection.Input);
-            parameters.Add("@Status", (int)HttpStatusCode.OK, DbType.Int32, ParameterDirection.Input);
+            parameters.Add("@Status", 0, DbType.Int32, ParameterDirection.Input);
             parameters.Add("@CreatedOn", DateTime.Now.ToUniversalTime(), DbType.DateTime, ParameterDirection.Input);
             parameters.Add("@FinishedOn", EVCBConfiguration.DefaultTime, DbType.DateTime, ParameterDirection.Input);
             parameters.Add("@EVSE_Value", string.Empty, DbType.String, ParameterDirection.Input);
@@ -191,7 +191,7 @@ namespace EVCB_OCPP.WEBAPI.Services
                 else
                 {
                     excution.IsRepliedbyEVSE = false;
-                    if (operation.Status == 200)
+                    if (operation.Status == 0)
                     {
                         excution.Code = 0;
                         excution.IsWaited = true;

+ 1 - 0
EVCB_OCPP.WEBAPI/Web.config

@@ -11,6 +11,7 @@
     <add name="ConnectionLogDBContext" connectionString="data source=172.1.2.187\SQLEXPRESS2017;initial catalog=StandardOCPP_ConnectionLog;persist security info=True;user id=sa;password=Ph0930118811;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
     <add name="MainDBContext" connectionString="data source=172.1.2.187\SQLEXPRESS2017;initial catalog=StandardOCPP_Main;;persist security info=True;user id=sa;password=Ph0930118811;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
     <add name="MeterValueDBContext" connectionString="data source=172.1.2.187\SQLEXPRESS2017;initial catalog=StandardOCPP_MeterValue;;persist security info=True;user id=sa;password=Ph0930118811;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
+     <add name="APILogDBContext" connectionString="data source=172.1.2.187\SQLEXPRESS2017;initial catalog=StandardOCPP_APILog;;persist security info=True;user id=sa;password=Ph0930118811;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
   </connectionStrings>
   <appSettings>
     <add key="webpages:Version" value="3.0.0.0" />