Enyim Memcached Client不会写入/读取数据

Ric*_*ett 11 c# memcached

我在Windows上安装了memcached作为服务,监听默认端口11211.我知道这有效,因为我可以telnet到服务器并执行get/set命令而没有任何问题.

然后我下载了Enyim Memcached客户端(Enyim.Caching.dll,版本2.7)并编写了一个简单的测试程序:

var mcc = new MemcachedClientConfiguration();
mcc.AddServer("127.0.0.1:11211");
mcc.SocketPool.ReceiveTimeout = new TimeSpan(0, 0, 10);
mcc.SocketPool.ConnectionTimeout = new TimeSpan(0, 0, 10);
mcc.SocketPool.DeadTimeout = new TimeSpan(0, 0, 20);

using (MemcachedClient client = new MemcachedClient(mcc))
{
    client.Store(StoreMode.Set, "enyimtest", "test value");
    Console.WriteLine(client.Get<string>("enyimtest"));
}
Run Code Online (Sandbox Code Playgroud)

我知道这正确连接到我的服务器,因为stats在telnet中调用命令会显示连接数量增加.但是,它不会调用get或set,因为cmd_getcmd_setstats计数器保持不变.调用client.Get返回null.

该程序没有任何错误.有谁知道什么可以阻止Enyim客户在这种情况下工作?

编辑:

看起来这是由超时引起的.在配置log4net以捕获客户端的日志记录输出后,我发现它包含以下内容(除了其他堆栈跟踪项):

2010-12-17 14:26:37,579 [1]错误Enyim.Caching.Memcached.MemcachedNode [(null)] - System.IO.IOException:无法从套接字'172.23.0.100:11211'读取.错误:TimedOut

2010-12-17 14:26:37,626 [1] WARN Enyim.Caching.Memcached.MemcachedNode.InternalPoolImpl [(null)] - 将节点172.23.0.100:11211标记为已死

我还是不明白为什么它会超时呢?

Ric*_*ett 18

经过一个小时左右的游戏,我找到了答案.我使用Wireshark来查看进出服务器的网络流量.我注意到在使用Enyim客户端时,消息看起来与使用telnet时的消息完全不同.特别是,在使用Enyim客户端时,我无法读取通过线路的协议命令.

因此,我得出结论,Enyim客户端使用的是不同的协议.

第二个协议被添加到版本1.4中的memcached服务器,这是二进制协议.在此之前,仅支持文本协议.我可以为memcached找到的最新的Windows二进制文件来自Jellycan,它只有版本1.2.6.

Enyim客户端配置为默认使用二进制协议,我的服务器忽略了它,因为它无法理解.

我在测试程序中添加了以下行,并立即开始工作:

mcc.Protocol = MemcachedProtocol.Text;
Run Code Online (Sandbox Code Playgroud)