SignalR serverSentEvents на Windows Server 2008 с запросом POST IIS 7, который занимает слишком много времени для выполнения
Я использую SignalR 2.0.0-beta2
и он ведет себя странно в производственной среде, где ASP.NET MVC 5
Приложение [ .NET Framework 4.5 ] установлено на Windows Server 2008
с IIS 7
, AppPool находится в интегрированном режиме и имеет только это приложение.
GET
запрос сделан SignalR
занимает всего 60 мс:
http://mysite.org.br/signalr/negotiate?clientProtocol=1.3&_=1374377239338
Проблема происходит с POST
просьба, которая занимает вечность. В самом последнем тесте прямо сейчас это заняло невероятные 3 м 1 с:
http://mysite.org.br/signalr/send?transport=serverSentEvents&connectionToken=Lp%2BGdI6jVTLPrQ3ZGJ065F9GrMbKYWNmgrtKPZz%2BCUYAsxrqP7hyAMPr%2Bg1E3IRY%2F0brzXVanumPy7NPCFOlcXTRrJssFD2EEoxd6fWhAVEUSfIj
Когда возникает эта периодически возникающая проблема, для выполнения запроса обычно требуется более 40 секунд.
Тестирование с Firefox 22
и Firebug... если я отключу кеш браузера, он будет работать без сбоев, т.е. POST
запрос. В противном случае, когда я включаю кеш браузера, он снова задерживает POST
запрос.
С помощью Google Chrome 28
POST находится там с ожидающим статусом.
Если я переработаю AppPool
тогда POST
запрос занимает всего 203 мс. Единственная модификация, которую я сделал для этого конкретного AppPool
что я поставил Idle Time-out (minutes) = 0
я хотел бы избежать повторного использования AppPool.
Глядя на Process Explorer, я вижу, что w3wp.exe
имеет 177.300 KB (Private Bytes)
а также 211.900 (Working Set)
а также CPU
является 0
прямо сейчас.
Вот SignalR
информация журнала, взятая из консоли Firebug:
[00:27:20 GMT-0300] SignalR: Negotiating with '/signalr/negotiate?clientProtocol=1.3'.
Signal...FCU9MU1 (line 1)
GET http://mysiste.org.br/signalr/negotiate?clientProtocol=1.3&_=1374377239338 200 OK 62ms
js?v=K...xUBM641 (line 1)
[00:27:20 GMT-0300] SignalR: Attempting to connect to SSE endpoint 'http://mysiste.org.br/signalr/connect?transport=serverSentEvents&connectionToken=Lp%2BGdI6jVTLPrQ3ZGJ065F9GrMbKYWNmgrtKPZz%2BCUYAsxrqP7hyAMPr%2Bg1E3IRY%2F0brzXVanumPy7NPCFOlcXTRrJssFD2EEoxd6fWhAVEUSfIj&connectionData=%5B%7B%22name%22%3A%22assessmenthub%22%7D%5D&tid=5'
Signal...FCU9MU1 (line 1)
[00:27:20 GMT-0300] SignalR: EventSource connected
Signal...FCU9MU1 (line 1)
[00:27:20 GMT-0300] SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332 and a connection lost timeout of 20000
Signal...FCU9MU1 (line 1)
POST http://mysiste.org.br/signalr/send?transport=s...F0brzXVanumPy7NPCFOlcXTRrJssFD2EEoxd6fWhAVEUSfIj 200 OK 3m 1s
js?v=K...xUBM641 (line 1)
[00:39:12 GMT-0300] SignalR: EventSource readyState: 0
Signal...FCU9MU1 (line 1)
[00:39:12 GMT-0300] SignalR: EventSource reconnecting due to the server connection ending
Signal...FCU9MU1 (line 1)
[00:39:14 GMT-0300] SignalR: EventSource calling close()
Signal...FCU9MU1 (line 1)
[00:39:14 GMT-0300] SignalR: serverSentEvents reconnecting
Signal...FCU9MU1 (line 1)
[00:39:14 GMT-0300] SignalR: Attempting to connect to SSE endpoint 'http://mysiste.org.br/signalr/reconnect?transport=serverSentEvents&connectionToken=Lp%2BGdI6jVTLPrQ3ZGJ065F9GrMbKYWNmgrtKPZz%2BCUYAsxrqP7hyAMPr%2Bg1E3IRY%2F0brzXVanumPy7NPCFOlcXTRrJssFD2EEoxd6fWhAVEUSfIj&connectionData=%5B%7B%22name%22%3A%22assessmenthub%22%7D%5D&messageId=d-k%2C0%7Cx%2C0%7Cy%2C1%7Cz%2C0&tid=5'
Signal...FCU9MU1 (line 1)
[00:39:44 GMT-0300] SignalR: Couldn't reconnect within the configured timeout (30000ms), disconnecting.
Signal...FCU9MU1 (line 1)
[00:39:44 GMT-0300] SignalR: SignalR: Stopping connection.
мой Web.config
имеет эти настройки:
<system.web>
.
.
.
<sessionState mode="InProc" customProvider="DefaultSessionProvider">
<providers>
<add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
</providers>
</sessionState>
</system.web>
<system.webServer>
<urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="false" />
<validation validateIntegratedModeConfiguration="false" />
<staticContent>
<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" />
</staticContent>
<modules runAllManagedModulesForAllRequests="true">
<add name="PerRequestLifestyle" type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule, Castle.Windsor" />
</modules>
<handlers>
<add name="AttributeRouting" path="routes.axd" verb="*" type="AttributeRouting.Web.Logging.LogRoutesHandler, AttributeRouting.Web" />
</handlers>
<security>
<requestFiltering>
<requestLimits maxQueryString="10240"></requestLimits>
</requestFiltering>
</security>
</system.webServer>
Из симптомов похоже, что ответ как-то буферизуется. В этой проблеме SignalR упоминается антивирус AVG, но на моем клиентском сервере не установлен антивирус AVG. Она имеет McAfee
хоть.
Что может быть причиной такого поведения? Если вам нужна дополнительная информация для дальнейшей отладки, просто спросите, и я сделаю все возможное, чтобы предоставить ее.
Примечание: тем временем я вернулся к стабильной версии SignalR 1.1.2, и пока все работает нормально.
1 ответ
Просто чтобы прояснить это для всех, кто может столкнуться с этой проблемой в будущем:
Проблема связана с SessionState
используется в ASP.NET. Как сказал davidfowl:
Использование сессии с SignalR не будет работать вообще. Все запросы будут блокировать сеанс, и именно поэтому вы видите эти проблемы.
Итак, решение: удалить <sessionState>
Конфиг из вашего Web.config
файл и любые события сеанса, которые вы можете иметь в вашем Global.asax
,
<sessionState mode="InProc" customProvider="DefaultSessionProvider">
<providers>
<add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
</providers>
</sessionState>
После избавления от этого проблема была решена в моем случае.
Мне пришлось обновить до SignalR 2.0.0, чтобы действительно решить проблему.