public static void LogRequest(HttpActionContext actionContext) { RESTExposeContext restExposeContext = GetLoggingContext(); if (restExposeContext != null && (restExposeContext.TraceAll || restExposeContext.TraceErrors)) { HttpContext context = HttpContext.Current; StringBuilder requestTrace = new StringBuilder(); requestTrace.AppendLine(context.Request.HttpMethod + " " + context.Request.Url.ToString() + " " + context.Request.ServerVariables["SERVER_PROTOCOL"]); WriteRequestHeaders(requestTrace, context); if (actionContext.Request.Content != null) { byte[] content = actionContext.Request.Content.ReadAsByteArrayAsync().Result; if (!restExposeContext.IsRequestBinary) { try { string charset = RestServiceHttpUtils.TryGetRequestEncoding(actionContext.Request, DefaultEncoding); Encoding requestEncoding = Encoding.GetEncoding(charset); requestTrace.AppendLine(requestEncoding.GetString(content)); } catch { WriteBinaryData(requestTrace); } } else { WriteBinaryData(requestTrace); } } restExposeContext.RequestTrace = requestTrace.ToString(); } }
public static void LogRequest(HttpActionContext actionContext) { RESTExposeContext restExposeContext = GetLoggingContext(); if (restExposeContext != null && (restExposeContext.TraceAll || restExposeContext.TraceErrors)) { HttpContext context = HttpContext.Current; StringBuilder requestTrace = new StringBuilder(); requestTrace.AppendLine(context.Request.HttpMethod + " " + context.Request.Url.ToString() + " " + context.Request.ServerVariables["SERVER_PROTOCOL"]); foreach (string headerName in context.Request.Headers.Keys) { foreach (string headerValue in context.Request.Headers.GetValues(headerName)) { requestTrace.AppendLine(headerName + ": " + headerValue); } } if (actionContext.Request.Content != null) { byte[] content = actionContext.Request.Content.ReadAsByteArrayAsync().Result; if (!restExposeContext.IsRequestBinary) { try { string charset = RestServiceHttpUtils.TryGetRequestEncoding(actionContext.Request, "utf-8"); Encoding requestEncoding = Encoding.GetEncoding(charset); requestTrace.AppendLine(requestEncoding.GetString(content)); } catch { requestTrace.AppendLine("<BINARY DATA>"); } } else { requestTrace.AppendLine("<BINARY DATA>"); } } restExposeContext.RequestTrace = requestTrace.ToString(); } }
public static void LogResponse(HttpActionExecutedContext actionExecutedContext, string errorId = null) { if (actionExecutedContext == null || actionExecutedContext.Response == null) { return; } AppInfo appInfo = AppInfo.GetAppInfo(); HttpContext context = appInfo.Context; RESTExposeContext restExposeContext = GetLoggingContext(); if (restExposeContext != null && !restExposeContext.AlreadyLogged && ((!string.IsNullOrEmpty(restExposeContext.ErrorLogId) || (!appInfo.SelectiveLoggingEnabled || appInfo.Properties.AllowLogging)) && restExposeContext.LogRequest)) { TimeSpan duration = DateTime.Now.Subtract(restExposeContext.StartTime); int eSpaceId = appInfo.eSpaceId; int tenantId = appInfo.Tenant?.Id ?? 0; string errorIdToLog = errorId ?? restExposeContext.ErrorLogId; string source = RuntimePlatformUtils.GetRequestSourceForLogging(); string id = null; if (restExposeContext.LogTo == LogTo.RESTExpose) { id = IntegrationLog.StaticWrite(appInfo, DateTime.Now, (int)duration.TotalMilliseconds, source, null, restExposeContext.ServiceName + "." + restExposeContext.ActionName, "REST (Expose)", errorIdToLog, true); } else { HeContext heContext = appInfo.OsContext; string loginId = heContext?.Session?.NewRuntimeLoginInfo?.LoginId ?? string.Empty; int userId = heContext?.Session?.NewRuntimeLoginInfo?.UserId ?? 0; string username = heContext?.Session?.NewRuntimeLoginInfo?.Username ?? string.Empty; if (userId == 0) { userId = restExposeContext.RequesterUserId; username = restExposeContext.RequesterUsername; loginId = restExposeContext.RequesterLoginId; } if (restExposeContext.LogTo == LogTo.ScreenServices) { id = MobileRequestLog.StaticWrite(appInfo, DateTime.Now, restExposeContext.ScreenName, restExposeContext.ActionName, source, (int)duration.TotalMilliseconds, RuntimeEnvironment.MachineName, errorIdToLog, loginId, userId, username); } else if (restExposeContext.LogTo == LogTo.ServiceAPIs) { id = ServiceAPILog.StaticWrite( appInfo: appInfo, sessionInfo: heContext?.Session, instant: DateTime.Now, loginId: loginId, errorId: errorIdToLog, executedBy: RuntimeEnvironment.MachineName, action: restExposeContext.ServiceAPIMethodName, duration: (int)duration.TotalMilliseconds, source: source, endpoint: Path.Combine(appInfo.eSpaceName, "ServiceAPI", restExposeContext.ServiceAPIMethodName), originalRequestKey: restExposeContext.OriginalRequestKey ); } } bool withError = !string.IsNullOrEmpty(errorIdToLog); if (actionExecutedContext != null && restExposeContext.RequestTrace != null && (restExposeContext.TraceAll || (restExposeContext.TraceErrors && withError))) { StringBuilder responseTrace = new StringBuilder(); responseTrace.AppendLine(context.Request.ServerVariables["SERVER_PROTOCOL"] + " " + ((int)actionExecutedContext.Response.StatusCode).ToString() + " " + actionExecutedContext.Response.ReasonPhrase); WriteResponseHeaders(responseTrace, context, actionExecutedContext); if (actionExecutedContext.Response != null && actionExecutedContext.Response.Content != null) { if (!restExposeContext.IsResponseBinary) { try { byte[] content = actionExecutedContext.Response.Content.ReadAsByteArrayAsync().Result; string charset = RestServiceHttpUtils.TryGetResponseEncoding(actionExecutedContext.Response, DefaultEncoding); Encoding requestEncoding = Encoding.GetEncoding(charset); responseTrace.AppendLine(requestEncoding.GetString(content)); } catch { WriteBinaryData(responseTrace); } } else { WriteBinaryData(responseTrace); } } int tenantIdToDetailLog = (appInfo.Tenant != null ? appInfo.Tenant.Id : 0); string detail = $"{restExposeContext.RequestTrace}\n\n{responseTrace.ToString()}"; string detailLabel = "HTTP Trace"; StaticDetailLog(restExposeContext.LogTo, id, DateTime.Now, tenantIdToDetailLog, string.Empty, detail, detailLabel); } restExposeContext.AlreadyLogged = true; } }
public static void LogResponse(HttpActionExecutedContext actionExecutedContext, string errorId = null) { if (actionExecutedContext == null || actionExecutedContext.Response == null) { return; } AppInfo appInfo = AppInfo.GetAppInfo(); HttpContext context = appInfo.Context; RESTExposeContext restExposeContext = GetLoggingContext(); if (restExposeContext != null && !restExposeContext.AlreadyLogged && ((!string.IsNullOrEmpty(restExposeContext.ErrorLogId) || (!appInfo.SelectiveLoggingEnabled || appInfo.Properties.AllowLogging)) && restExposeContext.LogRequest)) { TimeSpan duration = DateTime.Now.Subtract(restExposeContext.StartTime); int eSpaceId = appInfo.eSpaceId; int tenantId = (appInfo.Tenant != null ? appInfo.Tenant.Id : 0); string errorIdToLog = errorId ?? restExposeContext.ErrorLogId; string source = RuntimePlatformUtils.GetClientIpForLogging(); string id = null; if (restExposeContext.IsScreenService) { HeContext heContext = appInfo.OsContext; string loginId = heContext.Session.NewRuntimeLoginInfo.LoginId; int userId = heContext.Session.NewRuntimeLoginInfo.UserId; id = MobileRequestLog.StaticWrite(DateTime.Now, eSpaceId, tenantId, restExposeContext.ScreenName, restExposeContext.ActionName, source, (int)duration.TotalMilliseconds, Environment.MachineName, errorIdToLog, loginId, userId); } else { id = IntegrationLog.StaticWrite(DateTime.Now, (int)duration.TotalMilliseconds, source, null, restExposeContext.ServiceName + "." + restExposeContext.ActionName, "REST (Expose)", eSpaceId, tenantId, errorIdToLog, Environment.MachineName, true); } bool withError = !string.IsNullOrEmpty(errorIdToLog); if (actionExecutedContext != null && restExposeContext.RequestTrace != null && (restExposeContext.TraceAll || (restExposeContext.TraceErrors && withError))) { StringBuilder responseTrace = new StringBuilder(); responseTrace.AppendLine(context.Request.ServerVariables["SERVER_PROTOCOL"] + " " + ((int)actionExecutedContext.Response.StatusCode).ToString() + " " + actionExecutedContext.Response.ReasonPhrase); if (HttpRuntime.UsingIntegratedPipeline) { foreach (var headerName in context.Response.Headers.AllKeys) { foreach (string headerValue in context.Response.Headers.GetValues(headerName)) { responseTrace.AppendLine(headerName + ": " + headerValue); } } } if (actionExecutedContext.Response != null && actionExecutedContext.Response.Content != null) { foreach (var header in actionExecutedContext.Response.Content.Headers) { foreach (string headerValue in header.Value) { responseTrace.AppendLine(header.Key + ": " + headerValue); } } if (restExposeContext.IsResponseBinary) { responseTrace.AppendLine("<BINARY DATA>"); } else { try { byte[] content = actionExecutedContext.Response.Content.ReadAsByteArrayAsync().Result; string charset = RestServiceHttpUtils.TryGetResponseEncoding(actionExecutedContext.Response, "utf-8"); Encoding requestEncoding = Encoding.GetEncoding(charset); responseTrace.AppendLine(requestEncoding.GetString(content)); } catch { responseTrace.AppendLine("<BINARY DATA>"); } } } int tenantIdToDetailLog = (appInfo.Tenant != null ? appInfo.Tenant.Id : 0); string detail = restExposeContext.RequestTrace + "\n\n" + responseTrace.ToString(); string detailLabel = "HTTP Trace"; if (restExposeContext.IsScreenService) { MRDetailLog.StaticWrite(id, DateTime.Now, tenantIdToDetailLog, "", detail, detailLabel); } else { IntDetailLog.StaticWrite(id, DateTime.Now, tenantIdToDetailLog, "", detail, detailLabel); } } restExposeContext.AlreadyLogged = true; } }