Переменная сеанса вызывает действия контроллера для запуска по одному - PullRequest
0 голосов
/ 17 октября 2018

У меня есть контроллер, который выполняет действия по одному, почти как будто он помещает мои запросы в очередь, а затем отвечает на каждый по очереди.Так, например, если я нажимаю 2 или 3 кнопки, которые настроены на POST для моего контроллера, контроллер будет в конечном итоге запускать все действия, но не правильно, когда я нажимаю кнопку.

После разрыва моего проекта я понял, что это странное поведение как-то вызвано установкой переменной Session в моем действии контроллера по умолчанию ..

Контроллер:

[HttpGet]
public ActionResult Index() //Start Page
{
    System.Web.HttpContext.Current.Session["SomeString"] = "SomeValue";
    return View();
}

[HttpPost]
public void Run(string json)
{
    for (int i = 0; i < 1000000; i++)
    {
        for (int j = 0; j < 1000000; j++)
        {

        }
    }
}

ИндексПредставление содержит только два элемента:

    <a href="#" class="submit">Run</a>
    <a href="Home/OtherPage">Other Page</a>

И AJAX для нажатия кнопки:

$(document).ready(function () {
    $(".submit").on('click', function () {
        $.ajax({
            type: 'POST',
            url: 'Run',
            data: "SomeString",
            dataType: "text"
        }); 
    }
}

Когда я удаляю строку кода, устанавливающую переменную сеанса, я могу нажать кнопку запуска (который запускает длительный цикл), нажмите кнопку «OtherPage» и сразу перейдите к представлению «OtherPage».Если я сделать установить переменную сеанса, запустить цикл, а затем нажать кнопку «OtherPage», мое приложение зависнет до завершения цикла, а затем перейдет к представлению «OtherPage».

У кого-нибудь есть идеи, почему это происходит?

1 Ответ

0 голосов
/ 17 октября 2018

Краткий ответ на ваш вопрос:

HostingEnvironment.QueueBackgroundWorkItem(()=>{//your code})

Длинный и менее опасный ответ: используйте систему очередей, такую ​​как RabbitMQ или AWS SQS или MSMQ или что-то еще.Фоновые задачи в веб-приложениях - это не лучшее, что вы можете сделать в своей жизни, даже если ответ (успех или неудача) для вас не важен.

РЕДАКТИРОВАТЬ :

Если вы используете Session State, вам, вероятно, потребуется отключить состояние сеанса - или установить его только для чтения - в контроллере, который вы хотите получить некоторый параллелизм.Добавьте следующий атрибут к необходимому вам контроллеру:

[SessionState(SessionStateBehavior.Disabled)]
public class FooController...

На этой странице объясняется, почему в некоторых случаях это может быть необходимо: http://hogaf.github.io/archive/2014/11/13/why-asp.net-requests-are-processed-sequentially

Но, опять же, это очень плохопрактика.Вам пришлось иметь дело с ThreadAbortException s, и у вас будет множество других проблем.

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