Я использую клиента servicestack.redis
для подключения. Redis в основном используется как объединительная плата SignalR (в которой используется клиент bookleeve). Я дополнительно используя ServiceStack.Redis клиент для поддержания списка соединенийServiceStack.Redis клиент - транзакция уже выполняется
У меня есть код, как это в RedisConnectionManager.cs
(наряду с аналогичными методами AddConnection
и GetConnections
. В AddConnection
и RemoveConnection
называются методами на SignalR ступице.
Теперь давайте перейдем к вопросу ... после того, как в то время, я получаю InvalidOperationException
с сообщением A transaction is already in progress
в CreateTransaction
вызова. Это, как правило, после того, как исключение выбрасывается Redis в если заявление if (connections == null || connections.Count == 0)
.
yway, случается, что после этого вещи перестают работать до тех пор, пока я не перезапущу процесс - поскольку каждый раз я получаю InvalidOperationException
. Я ткнул в клиентский код ServiceStack.Redis и, согласно документам, должен либо зафиксировать транзакцию, либо отказаться от нее. Похоже, этого не происходит, и тогда клиент находится в состоянии неопределенности, так как объект RedisClient.Transaction
никогда не бывает null
ред.
Я не мог найти отладчик ошибок для ServiceStack.Redis
, так что, надеюсь, люди на SO будут знать лучше.
public void RemoveConnection(string clientId, string connectionId)
{
try
{
var key = "CONNECTION_" + clientId;
redis.Watch(key);
var connections = redisTypedClient.Lists[key];
if (connections == null || connections.Count == 0)
{
return;
}
using (var t = redisTypedClient.CreateTransaction())
{
t.QueueCommand(c => c.RemoveItemFromList(connections, connectionId));
t.Commit();
}
}
finally
{
redis.UnWatch();
}
}