Я пытаюсь использовать TempData для отправки данных с одного запроса другому.Реализация ITempDataProvider vs Использование файлов cookie
Однако, поскольку TempData использует сеанс сервера, и это приложение должно быть веб-фермой, я должен будет либо использовать cookie-файлы, либо базу данных, вместо этого, поскольку сеанс не будет передаваться с одного сервера на другой.
Есть целый ряд реализаций доступен для использования куков вместо сессии по умолчанию:
public class CookieTempDataProvider : ITempDataProvider
{
const string CookieName = "TempData";
public void SaveTempData(
ControllerContext controllerContext,
IDictionary<string, object> values)
{
// convert the temp data dictionary into json
string value = Serialize(values);
// compress the json (it really helps)
var bytes = Compress(value);
// sign and encrypt the data via the asp.net machine key
value = Protect(bytes);
// issue the cookie
IssueCookie(controllerContext, value);
}
public IDictionary<string, object> LoadTempData(
ControllerContext controllerContext)
{
// get the cookie
var value = GetCookieValue(controllerContext);
// verify and decrypt the value via the asp.net machine key
var bytes = Unprotect(value);
// decompress to json
value = Decompress(bytes);
// convert the json back to a dictionary
return Deserialize(value);
}
...
Ref. http://brockallen.com/2012/06/11/cookie-based-tempdata-provider/
Однако ни один из этих методов, похоже, не удаляет файл cookie после завершения запроса.
Не все время использования TempData для истечения срока действия данных после завершения запроса (если вы не используете TempData.Keep("myKey");
)?
Почему бы не использовать файлы cookie вместо внедрения ITempDataProvider? В чем разница/польза?
Дальнейшее чтение:
Вот простой печенье на основе реализации:
Вот реализация от Microsoft поставщика SessionState:
Edit для уточнения: В следующем коде Microsoft удаляет сессию после того, как он будет загружен таким образом, что она не может быть загружен снова:
// If we got it from Session, remove it so that no other request gets it
session.Remove(TempDataSessionStateKey);
В чем проблема с удалением файла cookie в вашей реализации? –
Ну, мне было немного любопытно, почему ни одна из других реализаций, которые я нашел, не удалил cookie. Я ожидал, что файл cookie будет удален так же, как Microsoft удаляет сеанс; однако это не то, что я нашел в приведенном выше кодексе Брок Аллена. – user1477388