2010-05-24 15 views
9

ग्रीटिंग्स, क्या कोई मुझे कुछ सलाह या लिंक दे सकता है जो मुझे निम्नलिखित परिदृश्य में लागू करने में मदद करेंगे। पृष्ठ एएसपीएनटी एमवीसी में लिखा जाएगा। सदस्यता द्वारा प्राधिकरणों को लागू किया जा रहा है। परिदृश्य इस प्रकार है:।asp.net mvc जो ऑनलाइन है

User 1 बस में लॉग इन किया है एक देर के बाद, User 2 सफलता के साथ प्रवेश करने का प्रयास करता है। फिर उपयोगकर्ता 1 को अधिसूचित किया जाना चाहिए कि उपयोगकर्ता 2 ने अभी लॉग इन किया है। इसके अतिरिक्त उपयोगकर्ता 2 को सूचित किया जाना चाहिए कि उपयोगकर्ता 1 ऑनलाइन है।

मैं कैसे ऐसा ही कुछ हासिल कर सकते हैं? इन उपयोगकर्ताओं के लिए एक-दूसरे को संदेश लिखना भी संभव होना चाहिए। (जैसे चैट)।

उत्तर

6

रहे हैं एएसपीनेट सदस्यता प्रदाताओं में ऐसा करने के लिए, विशेष रूप से, IsUserOnline() और countUsersOnline() जैसी कुछ। इन तरीकों के साथ एकमात्र समस्या यह है कि वे वास्तव में लंगड़ा हैं। वे सदस्यता प्रदाता की LastActivityDate() और एक विंडो पर निर्भर करते हैं जिसे आप web.config में सेट कर सकते हैं। दूसरे शब्दों में, उपयोगकर्ता को ऑनलाइन माना जाता है यदि सदस्यता प्रदाता के साथ उनका अंतिम मुठभेड़ और web.config में टाइम विंडो की समयसीमा समाप्त नहीं हुई है।

हम इस scenairo ले लिया है और यह एक धूमकेतु सर्वर की स्थापना, और वेब सर्वर हर दस मिनट पिंग द्वारा हमारे लिए काम कर दिया। जब वेब सर्वर पिंग किया जाता है, तो यह सदस्यता प्रदाता के LastActivityDate को अद्यतन करता है।

हम गतिविधि विंडो को 12 मिनट, साथ ही सत्र टाइमर पर सेट करते हैं। यह हमें यह निर्धारित करने की अनुमति देता है कि लगभग दस मिनट की सटीकता के लिए ऑनलाइन कौन है।


यहां वेब में पंक्ति है।config:

function getData() { 
    $.getJSON("/Account/Timer", gotData); 
    } 

    // Whenever a query stops, start a new one.  
    $(document).ajaxStop(getData, 600000); 

    // Start the first query. 
    getData(); 

यहाँ हमारे सर्वर कोड है::

<membership userIsOnlineTimeWindow="12"> 

यहाँ jQuery धूमकेतु सर्वर है

public JsonResult Timer() 
    { 
      MembershipUser user = Membership.GetUser(User.Name); 
      user.LastActivityDate = DateTime.Now; 

      Membership.UpdateUser(user); 

      // You can return anything to reset the timer. 
      return Json(new { Timer = "reset" }, JsonRequestBehavior.AllowGet); 
    } 
+0

मैं यह सर्वर कोड कहां जोड़ूं? – DoIt

3

मुझे लगता है जैसे आपको कुछ jQuery मतदान होने की आवश्यकता है।

आप आसानी से एक ActionResult जो तब ऑनलाइन उपयोगकर्ताओं के लिए जाँच करें और एक PartialView बुला jQuery कार्य करने के लिए वापस लौट जाएगा करने के लिए एक jQuery पोस्ट कर सकते हैं।

लौटने PartialView सभी उपयोगकर्ताओं लॉग इन किया है, जिसमें फिर पैनल एनिमेट किसी प्रकार में पॉप जा सकता है हो सकता है।

नियंत्रक को समय-समय पर मतदान निष्पादित करने के लिए जावास्क्रिप्ट का उपयोग करें।

+0

हाँ, मैं इसी तरह के समाधान लेकिन कैसे के बारे में सोच रहा था क्या मुझे ऑनलाइन जांचना चाहिए? कार्यक्षमता कैसे बनाएं (देखने के सर्वर पक्ष से) –

+0

सोचें कि जब कोई उपयोगकर्ता लॉग इन करता है तो आपको एक डीबी प्रविष्टि लिखना होगा और उस उपयोगकर्ता के सत्र अंत में, शायद प्रविष्टि को हटा दें। आप अनुमान लगा सकते हैं, सभी लॉग इन उपयोगकर्ताओं को कैश में रखें और उन्हें सत्र अंत में हटा दें। किसी भी तरह से मुझे लगता है कि आपको उन्हें कहीं लॉग इन करने और सत्र अंत या कुछ – griegs

+0

ठीक उपयोग करने की आवश्यकता है, और कोई सुझाव है कि मैं यह कैसे कर सकता हूं: "आप अनुमान लगा सकते हैं, सभी लॉग इन उपयोगकर्ताओं को कैश में रखें और उन्हें सत्र अंत में हटा दें "एएसपीएनटी एमवीसी में? –

2

आप onlines लाइव वेब में नहीं मिल सकता है। आपको पेज रीफ्रेश करना चाहिए या AJAX के साथ सामग्री रीफ्रेश करना चाहिए- अन्यथा-। तो यह मुझे लगता है हल करने वाला होगा।

ps। चैट और ऑनलाइन मुद्दों, आपके पास दो विकल्प हैं; आप उन्हें डेटाबेस में स्टोर कर सकते हैं - अपनी मैं क्या सुझाव है - स्मृति में या दुकान, आप this

टेबल्स देखने के लिए चाहते हो सकता है:

Users 
-Id/int - identity 
-LoginTime/datetime 
-IsOnline/bit 

Friends 
-Id/int - identity 
-FirstUserId/int 
-SecondUserId/int 

public class UserInformation 
{ 
    public IList<User> OnlineFriends { get; set;} 
    public IList<User> JustLoggedFriends { get; set; } /* For notifications */ 
} 

public class UserRepository 
{ 
    public UserInformation GetInformation(int id, DateTime lastCheck) 
    { 
     return Session.Linq<User>() 
       .Where(u => u.Id == id) 
       .Select(u => new { 
           User = u, 
           Friends = u.Friends.Where(f => f.FirstUser.Id == u.Id || f.SecondUser.Id == u.Id) 
       }) 
       .Select(a => new UserInformation { 
           JustLoggedFriends = u.Friends.Where(f => f.IsOnline && f.OnlineTime >= lastCheck).ToList(), 
           OnlineFriends = u.Friends.Where(f => f.IsOnline).ToList() 
       }) 
       .ToList(); 
    } 
} 

public class UserService 
{ 
    public UserInformation GetInformation(int id, DateTime lastCheck) 
    { 
     return repository.GetInformation(id, lastCheck); 
    } 
} 

यूआई:

तरीकों
public class UserController 
{ 
    public ActionResult Index() 
    { 
     var userId = (int)Session["UserId"]; 
     var lastCheck = (DateTime)Session["LastCheck"]; 
     UserInformation info = userService.GetInformation(userId, lastCheck); 
     Session["LastCheck"] = DateTime.Now; 

     //show up notifications and online users. 
    } 
    public ActionResult Login() 
    { 
     User user = null; // TODO: get user by username and password 
     Session["UserId"] = user.Id; 
     Session["LastCheck"] = DateTime.Now; 
    } 
} 
+0

और इसे कैसे कार्यान्वित किया जाए ताकि यह समय-समय पर (GetUserOnlineFriends का उपयोग करके) जांच कर सके - चलो हर दो मिनट -सर के दोस्त कहें? इसके अतिरिक्त इन दो दोस्तों के बीच चैट करने की संभावना को कैसे कार्यान्वित किया जाए? –

+0

सीमित नहीं है। आप सत्र_स्टार्ट और सत्र_एंड ईवेंट की जांच कर सकते हैं, फिर उपयोगकर्ता को ऑनलाइन-कॉलम अपडेट करें- जब सत्र_स्टार्ट निकाल दिया जाता है और जब अंत के निकाल दिए गए अपडेट उपयोगकर्ता ऑफलाइन के रूप में रिकॉर्ड करते हैं - कॉलम _डाटा प्रकार बिट_ इसे हल करने वाला है। और फिर यदि उपयोगकर्ता उन्हें ऑनलाइन दिखाते हैं। लेकिन यह एल्गोरिदम आपके लिए नहीं है, सत्र इसे हल करने वाला है। मैं अब समझ गया। अब संपादन – cem