Membase CouchDB无法在Mac OS X上使用Mono

时间:2011-08-11 08:51:24

标签: .net mono couchdb membase

我已经成功安装了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 个答案:

答案 0 :(得分:1)

我花了几个小时来解决这个问题。有a bug in the Mono runtime(它仍然存在于2.10.5 AFAIK中),导致两个版本的System.Web.Extensions之间发生冲突:3.5和4.0

为Membase客户端(现在是Couchbase客户端)提供的DLL与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(我认为它是安全的)。