我在连接C#
和Python
通过Memcached
. 我在服务器上安装了 Memcached。AC# 应用程序将使用该Enyim.Caching
库在 Memcached 上写入一些数据,然后 Python 应用程序将使用python-memcached
(我也尝试过pymemcache
)读取它pylibmc
。我也想扭转这个过程并让 C# 从 Python 中读取。
我的发现是:
- C# 和 Python 都可以写入和读取他们自己在服务器上编写的变量。
- 当 C# 编写 a
string
时,Python 可以很好地检索它。 - 其他配置失败并出现以下错误:
- C#
int
到 Python 的提升File "C:\Users\...\Anaconda2\envs\py37\lib\site-packages\memcache.py", line 1257, in _recv_value buf = self.decompressor(buf) error: Error -3 while decompressing data: incorrect header check"
- C#
byte
到 Python 的提升ValueError: invalid literal for int() with base 10: b' '
- Python
string
到 C# 的提升System.ArgumentException: 'Destination array is not long enough to copy all the items in the collection. Check array index and length.'
- Python
int
到 C# 的提升An unhandled exception of type 'System.NullReferenceException' occurred in testDatabaseC.dll Object reference not set to an instance of an object.
- Python
byte
到 C# 的提升System.InvalidCastException: 'Specified cast is not valid.'
- C#
字符串可以从 C# 到 Python 的事实让我认为我的代码没有任何问题。此列表中的第一个例外可能表明问题出在使用的压缩格式上。知道这个 Python 库使用zlib
,但我还没有找到任何可行的替代方案。
有任何想法吗?谢谢!
下面使用了一些代码:
使用 Python 编写并使用 C# 读取(在这种情况下是 an int
,但也可以是 abyte
或 a string
):
import memcache
memcachedServerIP = "192.168.1.101"
client = memcache.Client([(memcachedServerIP, 11211)])
dataToWrite = 5 # just a random integer to try
print(client.set("key", dataToWrite, time=10))
using System;
using MySql.Data.MySqlClient;
using Enyim.Caching;
using Enyim.Caching.Configuration;
using RGiesecke.DllExport;
using System.Runtime.InteropServices;
namespace testDatabase
{
public class Test
{
public static int readFromCache()
{
MemcachedClientConfiguration mcc = new MemcachedClientConfiguration();
MemcachedClient client;
mcc.AddServer("192.168.1.101: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);
client = new MemcachedClient(mcc);
int dataToRead;
dataToRead = (int)client.Get("key");
return dataToRead;
}
}
}
使用 C# 编写并使用 Python 读取:
using System;
using MySql.Data.MySqlClient;
using Enyim.Caching;
using Enyim.Caching.Configuration;
using RGiesecke.DllExport;
using System.Runtime.InteropServices;
namespace testDatabase
{
public class Test
{
public static int writeToCache()
{
MemcachedClientConfiguration mcc = new MemcachedClientConfiguration();
MemcachedClient client;
mcc.AddServer("192.168.1.101: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);
client = new MemcachedClient(mcc);
int dataToWrite = 5;
client.Store(Enyim.Caching.Memcached.StoreMode.Set, "key", dataToWrite);
return dataToWrite;
}
}
}
import memcache
memcachedServerIP = "192.168.1.101"
client = memcache.Client([(memcachedServerIP, 11211)])
print(client.get("key"))