2009-12-07 4 views
1

У меня есть приложение ASP.NET MVC 2 Beta, где мне нужно блокировать входящие запросы для определенного действия, пока у меня не будет доступных данных для возврата или просто отпустите запрос через 30 секунд без новых доступных данных.Как запросы IIS распараллеливаются с помощью COMET?

Для того, чтобы достичь этого, я использую AutoResetEvent.WaitOne(30000);

Большая проблема в том, что, кажется, не IIS будет принимать любой новый запрос в то время как поток блокируется на WaitOne инструкции. Новые запросы зависают до выпуска потоков.

Мне нужно иметь возможность распараллеливать запросы, сохраняя при этом поведение WaitOne.

ответ

2

Асинхронные обработчики - это то, что вы ищете. Если вы создаете кометное решение, вы можете проверить нашу реализацию .NET кометного сервера here, это сэкономит вам некоторое время. Если вы хотите сворачивать самостоятельно, вам, безусловно, нужно будет использовать обработчики async, чтобы избежать попадания верхних ограничений параллелизма к моменту, когда вы получите 60 или 70 пользователей, но даже с обработчиками async вам все равно придется сделайте некоторые причудливые работы ног. В основном, вы по-прежнему будете сталкиваться с некоторыми верхними пределами в потоковом пуле, если вы не передадите запросы в ограниченный пул потоков, который может в основном управлять всеми входящими запросами для вас.

Удачи вам!

+1

Спасибо за информацию. Решение WebSync кажется отличным вариантом. Тем не менее, я готов бросить свое решение или, возможно, использовать какой-то бесплатный компонент, не желая платить за это! В любом случае, спасибо за ценную информацию! –

+0

Кажется, что AsyncControllers - это путь, так как в этом сценарии официально не поддерживаются дескрипторы ожидания. –

1

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

+0

John, я на самом деле работаю над приложениями на основе Comet, поэтому это поведение реализуется намеренно, чтобы избежать подавления сервера множеством последовательных запросов. –

+2

Что делает COMET для блокировки потоков? Вместо этого используйте асинхронную страницу, и ваш ответ будет отложен, без блокировки любых потоков. –

+0

Кроме того, «COMET» следует упомянуть в вашем вопросе. Пожалуйста, отредактируйте свой вопрос, чтобы содержать больше деталей. –

0

Для веб-приложения более целесообразно (а не жесткое правило) возвращать сообщение, чтобы сообщить пользователям повторить попытку позже по какой-либо причине, которую вы хотите назвать.

Задержка/блокировка запросов «ожиданием» на самом деле не очень помогает, поскольку ожидание недетерминировано, если, конечно, у вас нет механизма, чтобы сделать это так.

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

0

На самом деле, это происходит только с ASP.NET MVC 2 Beta. Я отлично справился с MVC 2 Preview 2 и вернулся к этой версии для повторной проверки и подтвердил, что приложение отлично работает с этой версией.

Теперь возникает вопрос: почему я вижу это различное поведение между этими двумя версиями выпуска MVC и каково правильное поведение, которое я должен ожидать получить в этом сценарии?

+0

Я настоятельно рекомендую вам задать вопрос Microsoft, и вы достаточно скоро сделаете это, чтобы устранить проблему. –

+0

Я опубликовал проблему на codeplex.com (http://aspnet.codeplex.com/WorkItem/View.aspx?WorkItemId=5034) –

+0

Блокировка событий, как правило, не поддерживается в ASP.NET, потому что в структуре используются блокировки объектов на вашем от имени. Например, если два клиента используют один и тот же сеанс, их запросы будут сериализованы. Это может очень легко привести к проблемам взаимоблокировки, что, вероятно, является тем, что вы испытываете. Кто несет ответственность за сигнализацию о вашем событии и как выглядит этот код? Возможно ли, что * этот код можно выполнить? – Levi

Смежные вопросы