‫۹ سال و ۴ ماه قبل، دوشنبه ۲۸ اردیبهشت ۱۳۹۴، ساعت ۰۰:۴۳
این پیام‌ها برای نمونه جهت اعتبارسنجی‌های سمت سرور EF لازم است و بازگشت اطلاعات مناسبی به کاربر برای عکس العمل بهتر و همچنین استفاده‌ی از آن‌ها جهت ثبت ریز وقایع سیستم؛ برای بازبینی‌های آتی.
‫۹ سال و ۴ ماه قبل، دوشنبه ۲۸ اردیبهشت ۱۳۹۴، ساعت ۰۰:۳۰
مدل اصلی عموما همان domain models هستند؛ برای مثال مدل‌های EF و EF از این ویژگی‌ها جهت تنظیم ساختار بانک اطلاعاتی و همچنین اعتبارسنجی خاص خودش استفاده می‌کند. بنابراین قلب طراحی مدل‌های سیستم، مدل‌های domain هستند و view models صرفا کاربرد نمایش سفارشی اطلاعات و همچنین کاهش سطح در معرض دید قرار گرفتن مدل‌های domain را جهت بهبود وضعیت امنیتی سیستم، دارند.
‫۹ سال و ۵ ماه قبل، شنبه ۱۹ اردیبهشت ۱۳۹۴، ساعت ۰۴:۴۲
واقعا سپاسگذارم . ولی مشکلم و حل نمیکنه این موارد.
یکم گیج و سردرگم شدم.
ببینید من یه هاب ایجاد کردم به شکل زیر
 public class User
    {
        public string UserName { get; set; }
        public bool IsRole { get; set; }
        public HashSet<string> ConnectionIds { get; set; }
    }

    [Authorize]
    [HubName("userActivityHub")]
    public class UserActivityHub : Hub
    {
        private static readonly ConcurrentDictionary<string, User> Users = new ConcurrentDictionary<string, User>();
     

        public void AdminJoin()
        {
            Groups.Add(Context.ConnectionId, "admins");
        }

        public void Join()
        {
            var userName = Context.User.Identity.Name;
            var connectionId = Context.ConnectionId;
            var isAdmin = Context.User.IsInRole("Admin");

            var user = Users.GetOrAdd(userName, _ => new User
            {
                UserName = userName,
                IsRole = isAdmin,
                ConnectionIds = new HashSet<string>()
            });

            if (user.IsRole == true)
            {
                Groups.Add(user.ConnectionIds.ToString(), "admins");
            }
            else
            {
                lock (user.ConnectionIds)
                {
                    user.ConnectionIds.Add(connectionId);
                }
                Clients.Group("admins").showUserCount(Users.Count(a => a.Value.IsRole != true));
            }

        }

        public void GetUserCount()
        {
            Clients.Group("admins").showUserCount(Users.Count(a => a.Value.IsRole != true));
        }

        public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
        {
            if (stopCalled)
            {
                var userName = Context.User.Identity.Name;
                var connectionId = Context.ConnectionId;

                User user;
                Users.TryGetValue(userName, out user);
                if (user != null)
                {
                    lock (user.ConnectionIds)
                    {
                        user.ConnectionIds.RemoveWhere(cid => cid.Equals(connectionId));
                        if (!user.ConnectionIds.Any())
                        {
                            User removeUser;
                            Users.TryRemove(userName, out removeUser);
                        }
                    }
                }
                return Clients.Group("admins").showUserCount(Users.Count(a => a.Value.IsRole != true));
            }
            else
            {
                return base.OnDisconnected(false);
            }
        }
    }

اینک کد ویو Index
 <script type="text/javascript">
        var userHub = $.connection.userActivityHub;
        $.connection.hub.logging = true;
        $.connection.hub.start().done(function() {
            userHub.server.join();
        });

        $(function() {
            window.onbeforeunload = function() {
                $.connection.hub.stop();
            };
        });
    </script>

اینم ویو Index مربوط به Area Admin 
    <script type="text/javascript">
        var userHub = $.connection.userActivityHub;
        userHub.client.showUserCount = function (message) {
            $('#userOnlineCount').html(message);
        };
        $.connection.hub.start().done(function() {
            userHub.server.adminJoin().done(function() {
                userHub.server.getUserCount();
            });
        });
    </script>
وقتی کاربر لاگین میکنه یه کانتر تو ویو ادمین دارم که بهش اضافه میشه و برای لاگین کاربران درست کار میکنه.
مشکلم اینه که وقتی کاربر دکمه خروج و میزنه یا مرورگر رو میبنده رویداد OnDisconnected اجرا نمیشه! در نتیجه کانتر موجود در ویو ادمین هم کم نمیشه.
اینم کد دکمه خروج که البته تو یه پارشال ویو وجود داره
<script>
    $('a.btn.btn-danger.btn-block').click(function(e) {
        e.preventDefault();
        $('#logoutForm').submit();
        $.connection.userActivityHub.connection.stop();
    });
    $(function() {
        window.onbeforeunload = function(e) {
            $.connection.hub.stop();
        };
    });

</script>
نمیدونم مشکل کجاست! آیا باید برای دکمه خروج هم یه متد تو هاب ایجاد کنم یا همون Ondisconnected کافیه!
واقعا ممنون از زحمات شما.
‫۹ سال و ۵ ماه قبل، شنبه ۱۹ اردیبهشت ۱۳۹۴، ساعت ۰۴:۲۳
این قیاس صحیح نیست چون AutoMapper یک Mini ORM نیست؛ اما می‌توان بر اساس آن یک Mini ORM ساخت که نمونه‌ای از آن در اینجا مطرح شده‌است.
‫۹ سال و ۵ ماه قبل، شنبه ۱۹ اردیبهشت ۱۳۹۴، ساعت ۰۴:۱۸
- در مطلب «نمایش بلادرنگ تعداد کاربران آنلاین توسط SignalR » یک کش برای کاربران متصل به سیستم تهیه شده‌است (کش context id‌ها و IP کاربر):
public static readonly ConcurrentDictionary<string, string> OnlineUsers = 
        new ConcurrentDictionary<string, string>();
بسته شدن یک tab، فقط یک context id را حذف می‌کند. اما هنوز بر اساس IP یک شخص، ممکن است context id‌های دیگری هم وجود داشته باشند (بنابراین آمارش صفر نخواهد شد).

+ کمی بالاتر در نظرات هم توضیح دادم. اگر پارامتر stopCalled متد OnDisconnected مساوی true باشد، یعنی کاربر «به هر نحوی» به سرور در مورد قطع اتصالش اطلاع رسانی کرده‌است. اگر مقدار آن false باشد، یعنی SignalR این متد را به علت عدم فعالیت کاربر در طی 35 ثانیه‌ی قبل فراخوانی کرده‌است. بنابراین این دو مورد را باید مدیریت کنید (اطلاعات رسانی‌های سمت سرور و سمت کاربر).
- در مورد اطلاع رسانی‌های ویژه هم مطلب در گروه SignalR سایت داریم.
‫۹ سال و ۵ ماه قبل، شنبه ۱۹ اردیبهشت ۱۳۹۴، ساعت ۰۴:۰۹
با تشکر از پاسخ سریعتون
ذکر این نکته که همه مثال‌های موجود فقط دارن از یه صفحه یا یک ویو استفاده میکنن.
اگه بخوایم که وقتی کاربر تو صفحه X کاری انجام میده و کاربر مدیر تو صفحه مدیریت خودش باخبر بشه و مثلا یه Notification اونجا ببینه چطور میشه انجام داد؟
ممکنه در مورد مدیریت signalr درمورد  بسته شدن تب‌های مرورگر توسط کاربر در حالتی که :
1 - فقط یک تب  از سایت باز باشه و کابر روب دکمه close مربوط به تب مرورگر کلیک کنه.؟ در این صورت کاربر باید از لیست کاربران آنلاین حذف بشه
2- از بین چند تب باز شده از سایت یکیشو ببنده. در این حالت چون هنوز صفحه ای از سایت بازه در نتیجه نباید متد ondisconnected () اجرا بشه و کاربر از لیست کاربران آنلاین حذف بشه!
درمورد گزینه دوم امکانش هست توضیح بیشتری بدید. signalr چطور مدیریت میکنه؟