【问题标题】:Membase CouchDB can't get it working with Mono on Mac OS XMembase CouchDB 无法在 Mac OS X 上使用 Mono
【发布时间】:2011-08-11 08:51:24
【问题描述】:

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

【问题讨论】:

  • 我在这里看到的不正确的一件事是,您在配置中指定了一个名为 helloworld 的存储桶,但尝试在连接字符串中连接到一个名为 default 的存储桶。我对 Enyim 客户端不是很熟悉,但如果您遇到问题,最好从 Couchbase 网站上的示例开始。我知道你可以使用一个配置文件。一旦你开始工作,你可以调整设置以适应你的特定项目。
  • 对不起两位 cmets。您还提到您在问题中使用 Membase couchDB,然后在描述中您说您使用 Membase 服务器。你可以说得更详细点吗? Couchbase 提供了 Couchbase single,这是他们的 CouchDB 版本,Membase 服务器是提供亚毫秒级延迟的产品,然后是 Couchbase 服务器,它是 CouchDB 和 Membase 的组合。如果您可以指定您使用的是哪个,我可以更好地帮助您解决问题。
  • 您好,抱歉打扰了,我尝试使用 Membase Server,但现在我想我什么都不懂,我在这里创建了另一个问题 stackoverflow.com/questions/7040980/… 我将不胜感激.谢谢!

标签: .net mono couchdb membase


【解决方案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 可以删除(我认为它是安全的)。

【讨论】:

  • 更新:如果你编译最新的couchbase-client分支(2012年6月发布11),吊床库已经消失,所以不需要删除SetTcpKeepAlive
猜你喜欢
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 2013-10-31
  • 2017-07-19
相关资源
最近更新 更多