我已经成功安装了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)
答案 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(我认为它是安全的)。