예제 #1
0
        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;
                }
            }
        }
예제 #2
0
        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;
                }
            }
        }
예제 #3
0
        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;
                }
            }
        }
예제 #4
0
        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);
        }