2010-11-12 1 views
1

Я пытаюсь создать тестовый веб-сайт mono asp.net 4.0, в котором используются серверы memcached (http: //memcachedproviders.codeplex. ru /) с помощью Enyim.Memcached для доступа к memcached. Веб-сайт и memcachedproviders отлично работают на сервере Windows.В Mono провайдеры memcached сбрасываются через несколько часов после того, как «сокет не подключен». Ошибка 500

Я портировал рабочий сайт asp.net на моно (Ubuntu 10.10, Mono 2.8), и он работает правильно и вытягивает сеансы с внешнего сервера, работающего с memcached, но необъяснимо, каждые пару часов или сбоев сайта, и просто возвращает ошибку 500, в которой говорится: «Сокет не подключен» Это происходит только тогда, когда состояние сеанса memcachedproviders включено.

Есть ли у кого-нибудь опыт настройки memcachedproveders для сеанса в моно или знаете, по крайней мере, где я должен начать искать? Хотя я знаком с linux и apache, я обычно более удобен с окнами, поэтому может отсутствовать какая-то конфигурация.

Насколько я могу сказать, что это бревно из апача с момента ошибки, даже с отладкой из mod_mono:

[Tue Nov 09 17:53:17 2010] [notice] caught SIGTERM, shutting down 
[Tue Nov 09 17:53:19 2010] [notice] Apache/2.2.14 (Ubuntu) mod_mono/2.8 configured -- resuming normal operations 
Listening on: /tmp/mod_mono_server_global 
Root directory:/
Listening on: /tmp/mod_mono_server_global 
Root directory:/
Error: There's already a server listening on /tmp/mod_mono_server_global 
mod-mono-server4 
mod-mono-server4 
Listening on: /tmp/mod_mono_server_mysite 
Root directory: /srv/www/mysite 
[Tue Nov 09 17:53:58 2010] [error] (104)Connection reset by peer: read_data failed 
[Tue Nov 09 17:53:58 2010] [error] Command stream corrupted, last command was -1 

Общая Memcached конфигурация в web.config есть что-то вроде:

<enyim.com> 
    <memcached> 
     <servers> 
      <add address="##.##.##.##" port="11211"/> 
     </servers> 
     <socketPool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00"/> 
    </memcached> 
</enyim.com> 
... 
<sessionState cookieless="false" regenerateExpiredSessionId="true" mode="Custom" customProvider="MemcachedSessionProvider"> 
    <providers> 
     <add name="MemcachedSessionProvider" type="MemcachedProviders.Session.SessionStateProvider,MemcachedProviders" dbType="none" writeExceptionsToEventLog="true"/> 
    </providers> 
</sessionState> 

И трассировки стека:

System.Net.Sockets.SocketException: The socket is not connected 
    at System.Net.Sockets.Socket.Shutdown (SocketShutdown how) [0x00058] in /home/monoweb/mono-2.8/mcs/class/System/System.Net.Sockets/Socket_2_1.cs:698 
    at Enyim.Caching.Memcached.PooledSocket.Dispose (Boolean disposing) [0x00000] in <filename unknown>:0 
    at Enyim.Caching.Memcached.PooledSocket.Destroy() [0x00000] in <filename unknown>:0 
    at Enyim.Caching.Memcached.MemcachedNode+InternalPoolImpl.ReleaseSocket (Enyim.Caching.Memcached.PooledSocket socket) [0x00000] in <filename unknown>:0 
    at Enyim.Caching.Memcached.PooledSocket.Dispose (Boolean disposing) [0x00000] in <filename unknown>:0 
    at Enyim.Caching.Memcached.PooledSocket.System.IDisposable.Dispose() [0x00000] in <filename unknown>:0 
    at Enyim.Caching.Memcached.ItemOperation.Dispose() [0x00000] in <filename unknown>:0 
    at Enyim.Caching.Memcached.Operation.System.IDisposable.Dispose() [0x00000] in <filename unknown>:0 
    at Enyim.Caching.MemcachedClient.Store (Enyim.Caching.Memcached.ServerPool pool, StoreCommand mode, System.String key, System.Object value, UInt64 casValue, TimeSpan validFor, DateTime expiresAt) [0x00000] in <filename unknown>:0 
    at Enyim.Caching.MemcachedClient.Store (StoreMode mode, System.String key, System.Object value, TimeSpan validFor) [0x00000] in <filename unknown>:0 
    at MemcachedProviders.Session.SessionStateProvider.SetAndReleaseItemExclusive (System.Web.HttpContext context, System.String id, System.Web.SessionState.SessionStateStoreData item, System.Object lockId, Boolean newItem) [0x00000] in <filename unknown>:0 
    at System.Web.SessionState.SessionStateModule.OnReleaseRequestState (System.Object o, System.EventArgs args) [0x0003f] in /home/monoweb/mono-2.8/mcs/class/System.Web/System.Web.SessionState_2.0/SessionStateModule.cs:292 
    at System.Web.HttpApplication+<RunHooks>c__Iterator1.MoveNext() [0x001aa] in /home/monoweb/mono-2.8/mcs/class/System.Web/System.Web/HttpApplication.cs:1026 
    at System.Web.HttpApplication+<Pipeline>c__Iterator2.MoveNext() [0x00ec9] in /home/monoweb/mono-2.8/mcs/class/System.Web/System.Web/HttpApplication.cs:1385 
    at System.Web.HttpApplication.Tick() [0x00000] in /home/monoweb/mono-2.8/mcs/class/System.Web/System.Web/HttpApplication.cs:914 

ответ

2

Я в конечном итоге исправить эту проблему сначала загрузив источник для memcachedproviders и перекомпилировав его на ссылку enyim.memcached 2.7 (последняя версия). Это связано с некоторыми незначительными изменениями.

После этого в моно я получил другую ошибку, в пределах enyim memcached относительно string.IndexOfAny (http://msdn.microsoft.com/en-us/library/11w09h50.aspx), где проверяемая строка была нулевой, и поэтому выбрасывал исключение. Если я правильно читаю документы, я думаю, что он должен только генерировать исключение, если параметр имеет значение null, а не строку. Либо это, либо mod_mono случайно пытается получить доступ к сеансу [null], тогда как asp.net этого не делает.

Чтобы исправить это, я загрузил источник encim memcached и добавил проверку, которая заменила бы пустой пустой строкой перед вызовом функции. сессии memcached уже более 24 часов до сих пор без заминки.