2016-03-24 20 views
0

Kullanıcı oturum açarken ve kullanıcı pencerede oturum açarken nesneyi kaldırması gerektiğinde bir nesne eklemem gereken bir sözlüğe sahibim. Ayrıca xml için sözlüğü serileştiriyorum. C# 'de yeni olduğum gibi windows hizmeti de bazı şüphelerim var.Serialize sözlüğe XML C#

İşte kodum.

public class UserSessionCapturePlugin : IInformServiceHandler 
    { 
     public Dictionary<int, UserSessionInfo> UserSessionLookupTable = new Dictionary<int, UserSessionInfo>(); 

     public void OnSessionChange(SessionChangeDescription changeDescription) 
     { 
      switch (changeDescription.Reason) 
      { 
       //Case of Logon 
       case SessionChangeReason.SessionLogon: 
        //CreateRunningProcessesLog("UserSession-SessionLogon"); 

        UserSession userSessionLogin = new UserSession() 
        { 
         UserName = MachineHelper.GetUsername(), 
         UserGuid = MachineHelper.GetUserGuid(), 
         MachineGuid = MachineHelper.GetMachineGUID(), 
         LoginTime = DateTime.Now.ToUniversalTime(), 
         SessionGuid = Guid.NewGuid(), //New Guid generated for tracking the UserSession, this will be created on on logon 
         IsReadable = false, 
         SessionId = changeDescription.SessionId, 
        }; 

        UserSessionInfo userSessionInfoLogin = new UserSessionInfo() 
        { 
         UserName = MachineHelper.GetUsername(), 
         SessionGuid = userSessionLogin.SessionGuid, 
         IsActiveUser = true, 
         SessionId = changeDescription.SessionId, 
         LoginTime = userSessionLogin.LoginTime, 
         State = RowState.Added, 
        }; 

         UserSessionLookupTable.Add(userSessionInfoLogin.SessionId, userSessionInfoLogin); 
         XmlSerializer serializer = new XmlSerializer(typeof(Dictionary<Guid, UserSessionInfo>)); 
         TextWriter textWriter = new StreamWriter(@"UserSessionLookupDictionarySerialized.xml"); 
         serializer.Serialize(textWriter, UserSessionLookupTable); 
         textWriter.Close(); 


       //Case of Logoff 
       case SessionChangeReason.SessionLogoff: 
        UserSession userSessionLogoff = new UserSession() 
        { 
         UserName = MachineHelper.GetUsername(), 
         UserGuid = MachineHelper.GetUserGuid(), 
         MachineGuid = MachineHelper.GetMachineGUID(), 
         LogOffTime = DateTime.Now.ToUniversalTime(), 
         IsReadable = true, 
         SessionId = changeDescription.SessionId, 
        }; 

        UserSessionLookupTable.Remove(userSessionLogoff.SessionId); 
        XmlSerializer serializer = new XmlSerializer(typeof(Dictionary<Guid, UserSessionInfo>)); 
         TextWriter textWriter = new StreamWriter(@"UserSessionLookupDictionarySerialized.xml"); 
         serializer.Serialize(textWriter, UserSessionLookupTable); 
         textWriter.Close(); 
        break; 
      } 
     } 
    } 

Ama bu xml eklenecektir Son giriş kullanıcı veya yeni kullanıcı ek bir giriş ayrıntılarla değiştirilir olacağını edilir birden fazla kullanıcının oturum açıyorsanız aşağıda

  1. şüpheler var ?

  2. kullanıcı bilgilerini de xml kaldırılacaktır gelmez ya da (girdiyi deserializing ve kaldırmak gibi) başka yöntemler gereklidir kapatma iken?

Şu anda bu kodu neden burada gönderiyorum diye kodları ayıklamıyorum veya çalıştıramıyorum. kullanım ömrü ana ömrü ile yani UserSessionLookupTable olarak

+0

benziyor

Dictionary<Guid, UserSessionInfo> LoadUserSessionData() { try { var serializer = new XmlSerializer(typeof(KeyValuePair<Guid, UserSessionInfo>[])); using (var stream = new FileStream(@"UserSessionLookupDictionarySerialized.xml", FileMode.Open)) { var sessionData = (KeyValuePair<Guid, UserSessionInfo>[])serializer.Deserialize(stream) return sessionData.ToDictionary(i => i.Key, i => i.Value); } } catch (FileNotFoundException) { return new Dictionary<int, UserSessionInfo>(); } } void SaveUserSessionData(Dictionary<Guid, UserSessionInfo> sessionData) { var serializer = new XmlSerializer(typeof(KeyValuePair<Guid, UserSessionInfo>[])); using (var stream = new FileStream(@"UserSessionLookupDictionarySerialized.xml", FileMode. OpenOrCreate)) { serializer.Serialize(stream, sessionData.ToArray()); } } 

sonra mı? –

+0

Özür ... Ben sınıfta başlatılan ama burada –

+0

Benim endişe UserSessionLookupTable' 'yaşam döngüsünü bulmaktır (Sadece burada yöntem yapıştırılan) kodu dahil değil am, o statik veya statik olmayan nedir? ve bir kez mi, birden çok kez mi başlatıldı? –

cevap

2

statik olmayan bir amacıdır. Tüm kullanıcılar için UserSessionCapturePlugin aynı örneğini kullandığınız sürece, bu tüm kullanıcıların kaydını tutacaktır.

son kullanıcının sadece kaydını yapacak her istek için UserSessionLookupTable farklı örneğini oluşturuyorsanız.

Ayrıca XmlSerializer değil serialize Dictionary directly can.

davranışını düzeltmek ve tüm kullanıcı oturumlarının kaydını tutmak için, sana oturum, oturum bilgileri kaydedilirken şeklini değiştirmek için öneriyoruz.

  • mevcut xml yeni kullanıcı oturumu bilgi, birinci yükü tasarrufu ve serisini önce, içinde yeni bir kayıt eklemek tekrar serialize ve dosyaya kaydedin. (Bu ilk defa, dosya bulunamayacağından emin olmalısınız.)
  • Kullanıcı oturum bilgisini kaldırmadan önce, önce varolan xml'yi yükleyip deserialize edin, kaldırmak istediğiniz kaydı kaldırın, tekrar serileştirin ve tekrar kaydedin. dosyalamak. İşte

bazı pasajı o OnSessionChange irade Eğer `UserSessionLookupTable` başlatıldı gelmiş bu

public void OnSessionChange(SessionChangeDescription changeDescription) 
{ 
    switch (changeDescription.Reason) 
    { 
     //Case of Logon 
     case SessionChangeReason.SessionLogon: 
      //CreateRunningProcessesLog("UserSession-SessionLogon"); 

      UserSession userSessionLogin = new UserSession() 
      { 
       UserName = MachineHelper.GetUsername(), 
       UserGuid = MachineHelper.GetUserGuid(), 
       MachineGuid = MachineHelper.GetMachineGUID(), 
       LoginTime = DateTime.Now.ToUniversalTime(), 
       SessionGuid = Guid.NewGuid(), //New Guid generated for tracking the UserSession, this will be created on on logon 
       IsReadable = false, 
       SessionId = changeDescription.SessionId, 
      }; 

      UserSessionInfo userSessionInfoLogin = new UserSessionInfo() 
      { 
       UserName = MachineHelper.GetUsername(), 
       SessionGuid = userSessionLogin.SessionGuid, 
       IsActiveUser = true, 
       SessionId = changeDescription.SessionId, 
       LoginTime = userSessionLogin.LoginTime, 
       State = RowState.Added, 
      }; 

      var userSessionLookupTable = LoadUserSessionData(); 
      userSessionLookupTable.Add(userSessionInfoLogin.SessionId, userSessionInfoLogin); 
      SaveUserSessionData(userSessionLookupTable); 
      break; 

     //Case of Logoff 
     case SessionChangeReason.SessionLogoff: 
      UserSession userSessionLogoff = new UserSession() 
      { 
       UserName = MachineHelper.GetUsername(), 
       UserGuid = MachineHelper.GetUserGuid(), 
       MachineGuid = MachineHelper.GetMachineGUID(), 
       LogOffTime = DateTime.Now.ToUniversalTime(), 
       IsReadable = true, 
       SessionId = changeDescription.SessionId, 
      }; 

      var userSessionLookupTable = LoadUserSessionData(); 
      userSessionLookupTable.Remove(userSessionLogoff.SessionId); 
      SaveUserSessionData(userSessionLookupTable); 
      break; 
    } 
} 
+0

Teşekkürler, Bu mükemmel çalıştı :-) –