2

我已经成功安装了 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)

4

1 回答 1

1

我在这个问题上花了几个小时。Mono 运行时中存在一个错误(它仍然存在于 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 可以删除(我认为它是安全的)。

于 2012-03-30T06:55:05.970 回答