Потому что window.event
не существует в Firefox. Это потому, что в браузере есть разные модели событий, и вам придется иметь дело с их различиями или использовать библиотеку, такую как jQuery, чтобы не иметь дело со всеми различиями между браузерами. Добро пожаловать в DOM.
Нет шифрование есть. Данные хранятся с использованием двоичной сериализации (это намного быстрее, чем xml). Подробности смотрите в классе SessionStateUtility (вы можете просмотреть его, используя бесплатный Reflector ). Это код, который используется для сериализации:
internal static void Serialize(SessionStateStoreData item, Stream stream)
{
bool flag = true;
bool flag2 = true;
BinaryWriter writer = new BinaryWriter(stream);
writer.Write(item.Timeout);
if ((item.Items == null) || (item.Items.Count == 0))
{
flag = false;
}
writer.Write(flag);
if ((item.StaticObjects == null) || item.StaticObjects.NeverAccessed)
{
flag2 = false;
}
writer.Write(flag2);
if (flag)
{
((SessionStateItemCollection) item.Items).Serialize(writer);
}
if (flag2)
{
item.StaticObjects.Serialize(writer);
}
writer.Write((byte) 0xff);
}
У меня недавно была эта проблема, и пришлось деконструировать сохраненное состояние, чтобы исследовать проблему производительности ; примерный код был примерно таким:
byte[] blob = ... // TODO
using (var ms = new MemoryStream(blob))
using (BinaryReader reader = new BinaryReader(ms)) {
int len = reader.ReadInt32();
bool f1 = reader.ReadBoolean(), f2 = reader.ReadBoolean();
SessionStateItemCollection items = null;
HttpStaticObjectsCollection sitems = null;
if (f1) {
items = SessionStateItemCollection.Deserialize(reader);
}
if (f2) {
sitems = HttpStaticObjectsCollection.Deserialize(reader);
}
if (reader.ReadByte() != 0xFF) {
throw new InvalidOperationException("corrupt");
}
if (items != null) {
int max = items.Count;
for (int i = 0; i < max; i++) {
object obj = items[i];
Console.WriteLine("{0}\t{1}", items.Keys[i],
obj == null ? "n/a" : obj.GetType().FullName);
}
}
}