p4.net не может подключиться
Я использую API p4.net для создания некоторых отчетов из метаданных.
В одном из отчетов мне нужно сгенерировать количество строк изменений для каждого отчета о наборах изменений.
В качестве инструмента создания отчетов я использую MS SQL Reporting Services 2008, и я написал собственный dll, который использует API p4.net для вычисления количества измененных строк. он работает на местном без каких-либо проблем. Однако когда я запускаю код на сервере, он вычисляет, скажем, первую часть%20, а затем начинает выдавать Unable для подключения к серверу Perforce! Невозможно подключиться к Perforce! исключение.
Я пытаюсь те же учетные данные на локальном, он работает.. Я использую командную строку с теми же учетными данными на сервере, это работает.
Может ли кто-нибудь помочь мне с этим, если сталкивался раньше?
Вот код, который я использую. Если нужно
public static class PerforceLib
{
public static P4Connection p4conn = null;
private static void CheckConn()
{
try
{
if (p4conn == null)
{
p4conn = new P4Connection();
p4conn.Port = "address";
p4conn.User = "user";
p4conn.Password = "pwd*";
p4conn.Connect();
p4conn.Login("pwd");
}
else if (p4conn != null)
{
if(!p4conn.IsValidConnection(true, false))
{
Log("Check CONN : Connection is not valid, reconnecting");
p4conn.Login("pwd*");
}
}
}
catch (Exception ex )
{
Log(ex.Message);
}
}
public static int DiffByChangeSetNumber(string ChangeSetNumber)
{
try
{
CheckConn();
P4Record set = p4conn.Run("describe", "-s",ChangeSetNumber)[0];
string[] files = set.ArrayFields["depotFile"].ToArray<string>();
string[] revs = set.ArrayFields["rev"].ToArray<string>();
string[] actions = set.ArrayFields["action"].ToArray<string>();
int totalChanges = 0;
List<P4File> lstFiles = new List<P4File>();
for (int i = 0; i < files.Count(); i++)
{
if (actions[i].ToString() == "edit")
lstFiles.Add(new P4File() { DepotFile = files[i].ToString(), Revision = revs[i].ToString(), Action = actions[i].ToString() });
}
foreach (var item in lstFiles)
{
if (item.Revision != "1")
{
string firstfile = string.Format("{0}#{1}", item.DepotFile, (int.Parse(item.Revision) - 1).ToString());
string secondfile = string.Format("{0}#{1}", item.DepotFile, item.Revision);
P4UnParsedRecordSet rec = p4conn.RunUnParsed("diff2", "-ds", firstfile, secondfile);
if (rec.Messages.Count() > 1)
{
totalChanges = PerforceUtil.GetDiffResults(rec.Messages[1].ToString(), item.DepotFile);
}
}
}
GC.SuppressFinalize(lstFiles);
Log(string.Format("{0} / {1}", ChangeSetNumber,totalChanges.ToString() + Environment.NewLine));
return totalChanges;
}
catch (Exception ex)
{
Log(ex.Message + Environment.NewLine);
return -1;
}
}
}
Ваша помощь будет оценена
Большое спасибо
1 ответ
Я решил эту проблему. мы определили, что код проходит через диапазон эфемерных портов примерно через две минуты. как только он достиг максимального эфемерного порта, он снова пытался использовать тот же порт. Из-за того, что каждая команда Perforce создает новый сокет, доступные порты заканчивались после того, как было обработано около 1000 наборов изменений. Я установил значение ReservedPorts в HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters по умолчанию (1433,143), что дало мне больший диапазон эфемерного порта.
а также реализовал шаблон синглтона для P4Conn, который помог, поскольку я не закрывал соединение. Я проверяю только правильность соединения и авторизируюсь, если соединение недействительно.
Пожалуйста, дайте мне знать, если кто-то из вас, ребята, нуждается в какой-либо помощи в этом