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 сервер до последней версии.