Блокировка метода веб-сервиса для одного клиента - PullRequest
0 голосов
/ 06 июня 2018

Это мой сценарий: я работаю над системой электронной коммерции (ASP.NET MVC), которой пользователи могут «нравится» продукты.У меня есть метод в моем веб-сервисе (.svc), который, если пользователю уже понравился этот продукт, удаляет подобное, а если нет - добавляет продукт для продукта.

У меня естьПроблема здесь: я вызываю метод «Мне нравится» через Ajax асинхронно, если пользователь нажимает кнопку «Мне нравится» несколько раз непрерывно, поэтому метод вызывается несколько раз непрерывно.так как этот метод не является потокобезопасным, у меня могут быть проблемы здесь.(Например, он может вставлять подобное несколько раз для одного пользователя в базе данных)

Я пытался сделать его поточно-ориентированным с помощью оператора lock, но, по-видимому, он все еще не 'т работа.Это мой метод веб-сервиса:

    private static Object productLikeLock = new Object();
    [WebMethod, ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public bool ToggleProductLike(int productId)
    {
        try
        {
            if (User.Identity.IsAuthenticated)
            {
                lock (productLikeLock)
                {

                    if (/* User has already liked the product */)
                    {
                        // Remove it from the database
                        return true;
                    }
                    else
                    {
                        // Add it to the database
                        return true;
                    }
                }
            }
            return false;
        }
        catch (Exception ex)
        {
            return false;
        }
    }

Кто-нибудь может мне помочь и сообщить, что не так с моим кодом и подходом?Заранее спасибо

1 Ответ

0 голосов
/ 06 июня 2018

Что вам действительно нужно, так это блокировка, которая будет активна только для пользователя, а не для всего приложения.Приватная статика не подходит для блокировки здесь.Вы могли бы потенциально использовать Dictionary<UserId, LockObject> для блокировки, но это все еще не очень хорошо.

Я бы не предложил реализовать эту функцию в качестве переключателя.Переключение состояния всегда приведет вас к подобным неприятностям.

Попробуйте изменить конструкцию приложения, чтобы получить явное действие Like и Dislike.Таким образом, вам не нужно ничего блокировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...