2011-07-11 9 views
2

私はp4.net APIを使用してメタデータからいくつかのレポートを生成しています。p4.netはPerforceに接続できません

レポートの1つでは、チェンジセットレポートごとに変更行の番号を生成する必要があります。

レポートツールとして、私はMS SQL Reporting Services 2008を使用していますが、p4.net APIを使用して変更された行の数を計算するカスタムdllを作成しました。ローカルで問題なく動作します。しかし、サーバー上でコードを実行すると、最初の%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

に関するいかなる助けが必要な場合は私に知らせてください...私はビスタ、XPとWindows 7のマシンでそれをテストし、うまく働いています。..私はデフォルトの設定で新しいWindows 2003サーバー環境をセットアップし、試してみましたが、うまくいきませんでした。 – AnarchistGeek

答えて

1

を理解されるであろう。私たちはコードが約2分で一時的なポート範囲を回っていることを確認しました。最大エフェメラルポートに達すると、同じポートを再び使用しようとしていました。各PERFORCEコマンドによって新しいソケットが作成されるため、使用可能なポートは約1000個のチェンジセットを処理した後に使い果たされていました。 私はHKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ ParametersのReservedPorts値を設定しました。

また、私は接続を終了しないように助けられたP4Conn用のシングルトンパターンを実装しました。私は接続の有効性をチェックし、接続が有効でない場合はログインします。

君たちのいずれかがこの問題はWindows Server 2003のみで発生し、この

関連する問題