0

C#Pythonを介したインターフェイスに奇妙な問題がありますMemcached。サーバーに Memcached をインストールしました。AC# アプリケーションは、ライブラリを使用して Memcached にいくつかのデータを書き込みEnyim.Caching、次に Python アプリケーションはそれを使用して読み取ります(私もと をpython-memcached試しました)。また、プロセスを逆にして、Python から C# を読み取らせたいと考えています。pymemcachepylibmc

私の調査結果は次のとおりです。

  1. C# と Python はどちらも、サーバー上で自身が記述した変数を読み書きできます。
  2. C# が を書き込むとstring、Python はそれを問題なく取得できます。
  3. 他の構成は失敗し、次のエラーが発生します。
    • 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' '
    • Pythonstringから C# への昇給System.ArgumentException: 'Destination array is not long enough to copy all the items in the collection. Check array index and length.'
    • Pythonintから C# への昇給An unhandled exception of type 'System.NullReferenceException' occurred in testDatabaseC.dll Object reference not set to an instance of an object.
    • Pythonbyteから C# への昇給System.InvalidCastException: 'Specified cast is not valid.'

文字列が C# から Python へ一方向に移動できるという事実は、私のコードに問題はないと考えさせてくれます。このリストの最初の例外は、問題が使用されている圧縮形式にあることを示唆している可能性があります。この Python ライブラリzlibが を使用していることはわかっていますが、有効な代替手段は見つかりませんでした。

何か案は?ありがとう!

いくつかのコードは以下で使用されます:

Python で書き込み、C# で読み取るには (この場合はですが、または の場合intもあります):bytestring

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"))


4

0 に答える 0