p4.net не может подключиться - PullRequest
2 голосов
/ 11 июля 2011

Я использую 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 Ответ

1 голос
/ 22 июля 2011

Я решил эту проблему. мы определили, что код проходит через диапазон эфемерных портов примерно через две минуты. как только он достигает максимального временного порта, он снова пытается использовать тот же порт. Из-за того, что каждая команда перформанса создает новый сокет, доступные порты заканчивались после того, как было обработано около 1000 наборов изменений. Я установил значение ReservedPorts в HKLM \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters по умолчанию (1433,143), что дало мне больший диапазон эфемерного порта.

, а также реализовал шаблон синглтона для P4Conn, который помог, поскольку я не закрывал соединение. Я проверяю только правильность соединения и авторизируюсь, если соединение недействительно.

Пожалуйста, дайте мне знать, если кто-то из вас, ребята, нуждается в какой-либо помощи по этому поводу

...