protected virtual void Application_BeginRequest() { if (_startupError != null) { try { var exception = new FulcrumResourceException($"FATAL ERROR IN STARTUP for {FulcrumApplication.Setup?.Name}" + $" (InstanceId: {Environment.GetEnvironmentVariable("WEBSITE_INSTANCE_ID")}):" + $" {_startupError.Message}. Check fallback logs for details."); var error = ExceptionConverter.ToFulcrumError(exception, true); var statusCode = ExceptionConverter.ToHttpStatusCode(error); // TrySkipIisCustomErrors = true is important! Without it, IIS sets it's own response content. // See https://weblog.west-wind.com/posts/2017/jun/01/bypassing-iis-error-messages-in-aspnet Response.TrySkipIisCustomErrors = true; Response.StatusCode = statusCode != null ? (int)statusCode : (int)HttpStatusCode.InternalServerError; Response.ContentType = "application/json"; Response.Output.Write(JsonConvert.SerializeObject(error)); } catch (Exception e) { LogHelper.FallbackSafeLog(LogSeverityLevel.Critical, "Failure in Application_BeginRequest", e); throw; } } }
private static void Connect(IDbConnection connection, TimeSpan?connectTimeout) { var originalConnectionString = connection.ConnectionString; try { if (connectTimeout.HasValue) { var connStringBuilder = new SqlConnectionStringBuilder(connection.ConnectionString) { ConnectTimeout = (int)connectTimeout.Value.TotalSeconds }; connection.ConnectionString = connStringBuilder.ConnectionString; } connection.Open(); } catch (Exception e) { var sqlConnection = connection as SqlConnection; var database = connection.Database ?? "(unknown database)"; var dataSource = sqlConnection?.DataSource ?? "(unknown data source)"; var exception = new FulcrumResourceException($"Could not open database connection to {database} on {dataSource}", e); throw new CircuitBreakerException(exception); } finally { if (connection.State != ConnectionState.Open) { connection.ConnectionString = originalConnectionString; } } }
private static async Task ConnectAsync(IDbConnection connection, TimeSpan?connectTimeout, CancellationToken cancellationToken) { if (connection.State == ConnectionState.Open) { return; } var originalConnectionString = connection.ConnectionString; try { if (connectTimeout.HasValue) { var connStringBuilder = new SqlConnectionStringBuilder(connection.ConnectionString) { ConnectTimeout = (int)connectTimeout.Value.TotalSeconds }; connection.ConnectionString = connStringBuilder.ConnectionString; } if (connection is SqlConnection sqlConnection) { await sqlConnection.OpenAsync(cancellationToken); var a = sqlConnection.ClientConnectionId; } else { connection.Open(); } } catch (Exception e) { var sqlConnection = connection as SqlConnection; var database = connection.Database ?? "(unknown database)"; var dataSource = sqlConnection?.DataSource ?? "(unknown data source)"; var exception = new FulcrumResourceException( $"Could not open database connection to {database} on {dataSource}", e); throw new CircuitBreakerException(exception); } finally { if (connection.State != ConnectionState.Open) { connection.ConnectionString = originalConnectionString; } } }
public void ErrorDifferentType() { var fulcrumError = new FulcrumError { Type = FulcrumAssertionFailedException.ExceptionType, TechnicalMessage = Guid.NewGuid().ToString(), FriendlyMessage = Guid.NewGuid().ToString(), InstanceId = Guid.NewGuid().ToString(), CorrelationId = Guid.NewGuid().ToString(), Code = Guid.NewGuid().ToString(), ErrorLocation = Guid.NewGuid().ToString(), IsRetryMeaningful = true, MoreInfoUrl = Guid.NewGuid().ToString(), RecommendedWaitTimeInSeconds = 100.0, ServerTechnicalName = Guid.NewGuid().ToString() }; var fulcrumException = new FulcrumResourceException(Guid.NewGuid().ToString()); fulcrumException.CopyFrom(fulcrumError); // Equal UT.Assert.AreEqual(fulcrumException.TechnicalMessage, fulcrumException.Message); UT.Assert.AreEqual(fulcrumError.RecommendedWaitTimeInSeconds, fulcrumException.RecommendedWaitTimeInSeconds); UT.Assert.AreEqual(fulcrumError.IsRetryMeaningful, fulcrumException.IsRetryMeaningful); // NOT equal UT.Assert.AreNotEqual(fulcrumError.TechnicalMessage, fulcrumException.TechnicalMessage); UT.Assert.AreNotEqual(fulcrumError.ServerTechnicalName, fulcrumException.ServerTechnicalName); UT.Assert.AreNotEqual(fulcrumError.CorrelationId, fulcrumException.CorrelationId); UT.Assert.AreNotEqual(fulcrumError.Code, fulcrumException.Code); UT.Assert.AreNotEqual(fulcrumError.FriendlyMessage, fulcrumException.FriendlyMessage); UT.Assert.AreNotEqual(fulcrumError.Type, fulcrumException.Type); UT.Assert.AreEqual(FulcrumResourceException.ExceptionType, fulcrumException.Type); UT.Assert.AreNotEqual(fulcrumError.InstanceId, fulcrumException.InstanceId); UT.Assert.AreNotEqual(fulcrumError.MoreInfoUrl, fulcrumException.MoreInfoUrl); UT.Assert.IsNull(fulcrumException.ErrorLocation); // Other tests UT.Assert.IsNull(fulcrumException.InnerException); UT.Assert.AreEqual(fulcrumError.InstanceId, fulcrumException.InnerInstanceId); }