У меня есть страница входа, которая позволяет пользователю войти в систему. В событии HandlieValidSubmit()
я проверяю, совпадают ли имя пользователя и пароль со значением, хранящимся в базе данных.
Если все в порядке, я хочу сохранить некоторые данные в usercook ie перед перенаправлением на другой сайт. Это HTML / Blazor-код:
<EditForm>
<!-- standard form-controls here -->
</EditForm>
@code {
private Models.LoginUser _loginUser = new Models.LoginUser();
private EditContext _editContext;
private void HandleValidSubmit()
{
if (UserApi.Login(_loginUser.Mail, _loginUser.Password, out string error, out Guid? guid))
{
NaviationManager.NavigateTo($"/manage/{guid}");
}
}
}
Cook ie устанавливается из функции входа в систему и выглядит так:
public DateTime SetCookie<T>(T data, TimeSpan expiration, bool httpOnly = true, bool secure = true)
{
DateTime expireDate = DateTime.Now.Add(expiration);
if (data == null) return DateTime.Now;
Type dataType = typeof(T);
var response = _httpContextAccessor.HttpContext.Response;
CookieOptions cookieOptions = new CookieOptions
{
HttpOnly = httpOnly,
Secure = secure,
Expires = expireDate
};
foreach (var property in dataType.GetProperties())
{
var storeInCookieAttribute = property.GetCustomAttribute<StoreInCookieAttribute>();
if (storeInCookieAttribute == null) continue;
response.Cookies.Append(BuildCookieKey(dataType.Name, property.Name), property.GetValue(data) as string, cookieOptions);
}
return expireDate;
}
ИМХО это стандарт "how-to-write-cookies-in-netcore" - way.
Когда я пытаюсь написать cook ie, я получаю сообщение об ошибке:
"Заголовки ответа не может быть изменено, потому что ответ уже начался. "
Я понимаю, что эта ошибка хочет сказать мне. Увы, я действительно не знаю, как это предотвратить. Я ожидал, что в этот момент ответ вообще не должен был начинаться.
Есть ли другое событие, кроме HandleValidSubmit()
, которое мне нужно использовать вместо этого? Или я могу просто очистить Ответ перед тем, как написать повара ie без побочных эффектов?