Я ищу объяснение следующей проблемы: я использую sharpsnmplib для связи с устройствами в сети.Если я присваиваю результат «внешней» переменной, то результат метода Messenger.Walk содержит ноль элементов, если я присваиваю результаты внутри метода и возвращаю его, тогда метод имеет правильные результаты.
Я чувствую, что скучаю по чему-то очень очевидному, но не могу найти это. Что делает это более интересным, так это то, что следующий плохой код "работает" в 200 сетях, но имеет проблемы с некоторыми устройствами в конкретной сети.
Обновление :Я забыл это: Messenger.Walk sharpsnmplib принимает список в качестве аргумента и добавляет его результаты к нему.https://github.com/lextm/sharpsnmplib/blob/038a3a0272f688075f573490721194e40cd56e3f/SharpSnmpLib/Messaging/Messenger.cs#L689
«Ненадежный код»:
foreach (var item in devices.ToList())
{
try
{
List<Variable> res = new List<Variable>();
BadMethod(item, res);
logger.Debug(item.ipAddress + " count: " + res.Count);
}
catch (Exception er)
{
logger.Info("SNMP request error: " + er.Message);
continue;
}
}
private static int BadMethod(device devicesItem, List<Variable> res)
{
if (devicesItem.deviceType.snmpVersion == 1)
{
Messenger.Walk(VersionCode.V1,
new IPEndPoint(IPAddress.Parse(devicesItem.ipAddress), 161),
new OctetString(Properties.Test.Default.community),
new ObjectIdentifier("1.3.6.1.2.1.2.2.1.6"),
res,
14000,
WalkMode.WithinSubtree);
}
else if (devicesItem.deviceType.snmpVersion == 2)
{
Messenger.BulkWalk(VersionCode.V2,
new IPEndPoint(IPAddress.Parse(devicesItem.ipAddress), 161),
new OctetString(Properties.Test.Default.community),
new ObjectIdentifier("1.3.6.1.2.1.2.2.1.6"),
res,
14000,
1,
WalkMode.WithinSubtree,
null,
null);
}
}
Код, который работает:
foreach (var item in devices.ToList())
{
try
{
var res = GoodMethod(item);
logger.Debug(item.ipAddress + " count: " + res.Count);
}
catch (Exception er)
{
logger.Info("SNMP request error: " + er.Message);
continue;
}
}
private static List<Variable> GoodMethod(device devicesItem)
{
List<Variable> res = new List<Variable>();
if (devicesItem.deviceType.snmpVersion == 1)
{
Messenger.Walk(VersionCode.V1,
new IPEndPoint(IPAddress.Parse(devicesItem.ipAddress), 161),
new OctetString(Properties.Test.Default.community),
new ObjectIdentifier("1.3.6.1.2.1.2.2.1.6"),
res,
14000,
WalkMode.WithinSubtree);
}
else if (devicesItem.deviceType.snmpVersion == 2)
{
Messenger.BulkWalk(VersionCode.V2,
new IPEndPoint(IPAddress.Parse(devicesItem.ipAddress), 161),
new OctetString(Properties.Test.Default.community),
new ObjectIdentifier("1.3.6.1.2.1.2.2.1.6"),
res,
14000,
1,
WalkMode.WithinSubtree,
null,
null);
}
return res;
}