Enyim: Операция не поддерживается сервером или запрос был искажен

Я пытаюсь получить значение ключа, используя клиентскую библиотеку Enyim с сервера Memcache.

После подключения к серверу memcache я могу записать / заменить значения ключа, но при использовании операции get выдается следующее исключение:

NotSupportedException не было обработано. Операция не поддерживается сервером, или запрос был искажен. Если последнее, пожалуйста, сообщите об ошибке разработчикам.

Обратите внимание, я могу прочитать это значение, используя telnet/ другие библиотеки memcache.

Я не уверен, что что-то упустил или есть ошибка в пакете Enyim?

Вот код.

using System;
using System.Net;
using Enyim.Caching;
using Enyim.Caching.Configuration;
using Enyim.Caching.Memcached;

namespace Memcached
{
public class MemcacheClient
{
    private MemcachedClient _mc;
    private static readonly TimeSpan MinExpirationTimeSpan = new TimeSpan(0, 0, 30);


    public  MemcacheClient()
    {
        Startup();
    }

    private void Startup()
    {
        var config = new MemcachedClientConfiguration();
        config.Servers.Add(new IPEndPoint(IPAddress.Loopback, 11212));
       // config.Servers.Add(new IPEndPoint(IPAddress.Loopback, 11213));
        config.Protocol = MemcachedProtocol.Text;
        _mc = new MemcachedClient(config);
    }


    public bool SetItem(string key, object value)
    {
        if (_mc != null)
            return _mc.Store(StoreMode.Set, key, value);
        return false;
    }

    public bool SetItem(string key, object value, TimeSpan duration)
    {
        _ValidateExpirationDuration(duration);

        if (_mc != null)
        {
           var restult = _mc.Store(StoreMode.Set, key, value, DateTime.Now + duration);
            _mc.FlushAll();
            return restult;
        }
        return false;
    }

    private static void _ValidateExpirationDuration(TimeSpan duration)
    {
        if (duration <= MinExpirationTimeSpan)
            throw new ArgumentException("Cache expiration times of less than 30 seconds are ignored", "duration");
    }

    public object GetItem(string key)
    {
        if (_mc != null)
           return  _mc.Get(key); //<----------getting exception here
        return null;
    }

    public T GetItem<T>(string key) where T : class
    {
        var result = GetItem(key);
        if (result != null)
        {
            var targetObject = result as T;
            if (targetObject != null)
                return targetObject;
        }
        return null;
    }

    public bool Replace(string key, object value, TimeSpan duration)
    {
        _ValidateExpirationDuration(duration);
        if (_mc != null)
            return _mc.Store(StoreMode.Replace,  key, value, DateTime.Now + duration);
        return false;
    }

    public bool Replace(string key, object value)
    {
        if (_mc != null)
            return _mc.Store(StoreMode.Replace, key, value);
        return false;
    }


 }
}

Функция вызова

using System;
using System.Globalization;

namespace TryEnyim
{
class Program
{
    static void Main(string[] args)
    {
        var cache = new Memcached.MemcacheClient();
        Console.Write("Writing to cache: " + cache.SetItem("myString", "This is enyim @" + System.DateTime.Now.ToString(CultureInfo.InvariantCulture)));
        cache.Replace("myString", "This is enyim again @" + System.DateTime.Now.AddSeconds(10).ToString(CultureInfo.InvariantCulture));
        Console.WriteLine("Read key now: " + cache.GetItem<string>("myString"));// <----------getting exception here

        Console.ReadLine();

    }
 }

}

Я использую пакет Enyim (версия 2.12.0.0) от NuGet.

Любая помощь будет полезна.

Спасибо

1 ответ

Решение

В заключение! Я получил решение.

Потратив время на отладку кода, я решил обновить сервер Memcached с 1.2.4 до 1.4.5.

После обновления сервера Memcached клиент кэширования Enyim работает как шарм.

Простое решение:

Обновите Memcached сервер до последней версии.

Другие вопросы по тегам