ASP.NET MVC и Ajax, одновременные запросы? - PullRequest
35 голосов
/ 24 февраля 2010

Новичок AJAX здесь!
На данный момент в моем веб-приложении ASP.NET MVC мои AJAX-запросы, похоже, собираются в очередь или в очередь, я не уверен.
Похоже, ни один запрос не будет завершен, пока не завершится предыдущий запрос.
Как мне получить запросы на возврат независимо?
Я не хочу, чтобы кто-то давал мне ответ, но, возможно, есть ссылки на хорошие учебники или ресурсы, которые могут помочь. Спасибо

Ответы [ 6 ]

37 голосов
/ 24 февраля 2010

Я подробно остановлюсь на ответе Лахлана Роша, который является правильным.

Платформа ASP.NET будет "однопоточными" запросами, относящимися к области действия Session (глобальный ресурс), для предотвращения вмешательства одного запроса в другой. В WebForms я думаю, что вы можете использовать директиву Page, чтобы указать, что отдельные страницы не используют Session и, следовательно, не должны обрабатываться синхронно, как это.

Проблема в том, что в ASP.NET MVC все запросы используют Session , потому что он используется для реализации TempData. Как указал Лахлан Роше, вы можете полностью отключить состояние сеанса или справляться с этим в каждом конкретном случае.

Возможным решением может быть запуск собственных фоновых потоков для обработки любого долго выполняющегося кода, чтобы первоначальный запрос "завершался" как можно быстрее.

35 голосов
/ 24 февраля 2010

ASP.NET будет последовательно обрабатывать запросы для каждого сеанса, если только сеансы не настроены как отключенные или только для чтения в web.config через атрибут enableSessionState в элементе pages.

Поскольку это настройка страницы, это не повлияет на контроллеры MVC, и они по-прежнему будут подвергаться обработке последовательных запросов.

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

<system.web>
    <pages enableSessionState="ReadOnly"/>
</system.web>

Страницы также могут иметь свойство enableSessionState, хотя это не относится к представлениям MVC.

<%@ Page EnableSessionState="True" %>
30 голосов
/ 12 августа 2011

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

Поддержка безсессионного контроллера:

Sessionless Controller - еще одна замечательная новая функция в ASP.NET MVC 3. С Sessionless Controller вы можете легко контролировать поведение ваших сессий для контроллеров. Например, вы можете сделать Session вашего HomeController отключенным или ReadOnly, что позволяет одновременное выполнение запроса для одного пользователя. Для получения дополнительной информации см. Параллельные запросы в ASP.NET MVC и HowTo: Бессессионный контроллер в MVC3 - что и почему? .

- из этой статьи DZone .

Добавив SessionState(SessionStateBehaviour.Disabled) к вашему контроллеру, среда выполнения позволит вам вызывать несколько действий одновременно из одного сеанса браузера.

К сожалению, я не думаю, что есть способ пометить действие, чтобы отключить сеанс только при вызове этого действия, поэтому, если у вас есть контроллер, у которого есть некоторые действия, требующие сеанса, и другие, которые этого не делают, вам нужно будет переместить те, которые не входят в отдельный контроллер.

В более поздних версиях ASP MVC вы можете украшать отдельные классы контроллеров с помощью SessionStateAttribute

[System.Web.Mvc.SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
public class MyController : Controller 
{
}
2 голосов
/ 31 октября 2014

Начиная с версии .NET Framework v3.0, вы можете использовать перечисление SessionStateBehavior с SessionStateAttribute:

[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
public class MyController : BaseController { }
0 голосов
/ 27 сентября 2011

Ну, параллельный запрос в большей степени зависит от браузера, а если вы запустите 10 одновременных запросов к действию, используя AJax в Mozilla и то же самое, используя IE 8, то вы обнаружите, что Mozilla имеет стиль для запуска одного запроса, ожидания его ответа и затем запуска второй и так далее ... потому что это один за другим, в то время как в IE * это запускает около 6 одновременных запросов к серверу.

Таким образом, параллельный запрос также зависит от типа браузера.

0 голосов
/ 24 февраля 2010

Я предлагаю использовать jQuery для ваших потребностей ajax с asp.net mvc, я использовал его исключительно, и это было чрезвычайно легко.

Что касается учебников, я бы посмотрел на это: http://docs.jquery.com/Ajax

Существует множество опций, с которыми можно поиграть, и я также предлагаю загрузить firebug, чтобы вы могли наблюдать, как запросы запускаются с вашей страницы асинхронно, и видеть, запускаются ли они и что они возвращают и т. Д.

Как и другая сторона парня, AJAX-запросы асинхронны и не ставятся в очередь, и все они возвращаются независимо, когда они заканчивают, поэтому, если вы посмотрите в firebug, будет легко увидеть, что происходит за кулисами и до того отладчик получает удар

...