Я новичок в C# и SQL. Мой код из конечной точки выглядит следующим образом:
public IActionResult EndSession([Required(ErrorMessage = "Session Id is required.")]string sessionId)
{
DateTime startTime = DateTime.Now;
try
{
string logText = LogFormatter.Format(
WebUtilities.GetUser((ClaimsIdentity)HttpContext.User.Identity),
startTime, DateTime.Now, Privilege.ViewIMUData,
"End Session", "Attempting to delete user session.");
logger.LogInfo(logText);
EndUserSession(sessionId);
logText = LogFormatter.Format(
WebUtilities.GetUser((ClaimsIdentity)HttpContext.User.Identity),
startTime, DateTime.Now, Privilege.ViewIMUData,
"End Session", "Successfully deleted user session.");
logger.LogInfo(logText);
return Ok(true);
}
catch (Exception ex)
{
string logText = LogFormatter.Format(
WebUtilities.GetUser((ClaimsIdentity)HttpContext.User.Identity),
startTime, DateTime.Now, Privilege.ViewIMUData,
"End Session", ex.ToString());
logger.LogError(logText, ex);
return StatusCode(Constants.InternalServerErrorCode, "Failed! Unable to delete user session. Please check logs for more details.");
}
}
Мой код из уровня доступа к данным выглядит следующим образом:
public void EndUserSession(string sessionId)
{
using (SqlConnection connection = new SqlConnection(DataSourceHelper.ConnectionString))
{
try
{
using (SqlCommand command = new SqlCommand("EndUserSession", connection))
{
command.CommandType = CommandType.StoredProcedure;
command.CommandTimeout = Constants.SQL_COMMAND_TIMEOUT;
command.Parameters.AddWithValue("@SessionId", sessionId);
command.Parameters.AddWithValue("@SessionEndTime", DateTime.Now);
connection.Open();
command.ExecuteNonQuery();
}
}
catch (Exception)
{
throw;
}
}
}
Хранимая процедура:
IF OBJECT_ID('[dbo].[EndUserSession]') IS NOT NULL
DROP PROCEDURE [dbo].[EndUserSession]
GO
CREATE PROCEDURE [dbo].[EndUserSession]
@SessionId nvarchar(36),
@SessionEndTime datetime
WITH ENCRYPTION
AS
BEGIN
UPDATE [dbo].[USER_SESSION]
SET SESSION_END_DATETIME = @SessionEndTime
WHERE USER_SESSION_IID = @SessionId
END
GO
Когда заданный идентификатор сеанса не существует в базе данных, приложение останавливается и сразу же ловит ошибку и выдает внутренний код ошибки 500 из конечной точки, из которой я вызываю эту функцию.
Что я хочу сделать, так это обновить логи c, чтобы вы проверяли состояние запроса SQL и на основе этого возвращали true / false из функции EndUserSession, а также на основе того, что вы регистрируете, если есть сбой или если идентификатор сеанса не найден в таблице User_Session. Каков наилучший способ добиться этого?