Membase CouchDB не может заставить его работать с Mono в Mac OS X - PullRequest
2 голосов
/ 11 августа 2011

Я успешно установил Membase Server, их функция «Задержка доступа менее миллисекунды» фактически вынудила меня написать этот вопрос, иначе я бы уже десять раз перешел на MongoDB. Итак, вопрос: я правильно установил и настроил свой сервер Membase, теперь я хочу, чтобы мое клиентское приложение .NET получило доступ к этой базе данных, для этого я использую их клиент Enyim .NET. Я написал следующее тестовое приложение:

using System;
using System.Linq;
using System.Diagnostics;

using Membase;
using Membase.Configuration;

namespace CouchDB
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            var config = new MembaseClientConfiguration()
            {
                Bucket = "helloworld",
                BucketPassword = "123",
                NodeLocator = typeof(Enyim.Caching.Memcached.DefaultNodeLocator),
                Transcoder = new Enyim.Caching.Memcached.DefaultTranscoder(),
                KeyTransformer = new Enyim.Caching.Memcached.TigerHashKeyTransformer(),
                PerformanceMonitorFactory = null // I'm on Mac OS X
            };

            config.SocketPool.MinPoolSize = 10;
            config.SocketPool.MaxPoolSize = 20;
            config.SocketPool.DeadTimeout = TimeSpan.FromSeconds(10);
            config.SocketPool.ConnectionTimeout = TimeSpan.FromSeconds(5);
            config.Urls.Add(new Uri("http://localhost:8091/pools/default"));

            var client = new MembaseClient(config);


            var spoon = client.Get<String>("Spoon");

            Console.WriteLine(spoon);
        }
    }
}

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

"Невозможно привести тип источника к типу назначения"

в System.Web.Script.Serialization.JavaScriptSerializer..ctor (resolver = null, registerConverters = false)

1 Ответ

1 голос
/ 30 марта 2012

Я потратил несколько часов на эту проблему. ошибка во время выполнения Mono (она все еще присутствует в 2.10.5 AFAIK), которая вызывает конфликт между двумя версиями System.Web.Extensions: 3.5 и 4.0

DLLпредоставленные для клиента Membase (и теперь клиент Couchbase) связаны с версией 3.5.Я не знаю, что ссылается на версию 4.0, но все же что-то делает.Таким образом, решение состоит в том, чтобы применить перенаправление (я не проверял это):

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
     <dependentAssembly>
        <assemblyIdentity name="System.Web.Extensions"
                          publicKeyToken="31bf3856ad364e35"
                          culture="neutral" />
        <bindingRedirect oldVersion="3.5.0.0"
                         newVersion="4.0.0.0"/>
     </dependentAssembly>
  </assemblyBinding>
</runtime>

Или перекомпилировать клиент (это то, что я сделал).Есть две незначительные проблемы при компиляции клиента под mono: в MemcachedNode.cs есть явная реализация события Failed.Поскольку это не нужно (нет другого реализованного конфликтующего события Failed), вы можете просто удалить строки.Также есть SetTcpKeepAlive, который вы можете удалить (я думаю, что это безопасно).

...