我正在使用p4.net API从元数据生成一些报告。
在其中一个报告中,我需要为每个变更集报告生成一些更改行。
作为报告工具,我使用的是MS SQL Reporting Services 2008,我编写了一个自定义dll,它使用p4.net API来计算更改的行数。它在当地工作没有任何问题。但是,当我在服务器上运行代码时,它计算让我们先说%20部分,然后开始抛出无法连接到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;
}
}
}
您的帮助将不胜感激
非常感谢
答案 0 :(得分:1)
我已经解决了这个问题。我们发现代码在大约两分钟内绕过短暂的端口范围。一旦它到达最大的短暂端口,它就试图再次使用相同的端口。由于每个perforce命令都会创建一个新套接字,因此可用端口在处理了大约1000个更改集后就会耗尽。 我设置了HKLM \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters默认值(1433,143)的ReservedPorts值,它给了我更大范围的临时端口。
并且还实现了P4Conn的单例模式,这有助于我不关闭连接。我只检查连接的有效性,如果连接无效则登录。
如果你们中的任何人需要任何帮助,请告诉我们