Project.ReadProjectStatus - Méthode
Obtient l'état du projet spécifié.
Espace de noms : WebSvcProject
Assembly : ProjectServerServices (dans ProjectServerServices.dll)
Syntaxe
'Déclaration
<SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/Project/ReadProjectStatus", RequestNamespace := "https://schemas.microsoft.com/office/project/server/webservices/Project/", _
ResponseNamespace := "https://schemas.microsoft.com/office/project/server/webservices/Project/", _
Use := SoapBindingUse.Literal, ParameterStyle := SoapParameterStyle.Wrapped)> _
Public Function ReadProjectStatus ( _
projGuid As Guid, _
dataStore As DataStoreEnum, _
projName As String, _
projType As Integer _
) As ProjectDataSet
'Utilisation
Dim instance As Project
Dim projGuid As Guid
Dim dataStore As DataStoreEnum
Dim projName As String
Dim projType As Integer
Dim returnValue As ProjectDataSet
returnValue = instance.ReadProjectStatus(projGuid, _
dataStore, projName, projType)
[SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/Project/ReadProjectStatus", RequestNamespace = "https://schemas.microsoft.com/office/project/server/webservices/Project/",
ResponseNamespace = "https://schemas.microsoft.com/office/project/server/webservices/Project/",
Use = SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)]
public ProjectDataSet ReadProjectStatus(
Guid projGuid,
DataStoreEnum dataStore,
string projName,
int projType
)
Paramètres
projGuid
Type : System.GuidLe GUID du projet. Valeur par défaut est Guid.Empty.
dataStore
Type : WebSvcProject.DataStoreEnumLa base de données dans laquelle les données de projet sont situé (brouillons, publiée ou Archive). Valeur par défaut est PublishedStore.
projName
Type : System.StringLe nom du projet. La valeur par défaut est String.Empty, pour obtenir tous les projets visible par l'utilisateur.
projType
Type : System.Int32Le type de projet. Spécifiez à l'aide de Project.ProjectType et cast à un int. La valeur par défaut est Project.
Valeur renvoyée
Type : WebSvcProject.ProjectDataSet
L'état et les autorisations de l'utilisateur actuel détermine la liste des projets qui sont visibles. Le schéma ProjectDataSet contient uniquement le tableau Project , avec les champs suivants : PROJ_UID, PROJ_NAME, PROJ_TYPE, PROJ_CHECKOUTDATE, PROJ_SESSION_DESCRIPTION, WPROJ_LAST_PUB, PROJ_LAST_SAVED, CREATED_DATE, ENTERPRISE_PROJECT_TYPE_UID, ENTERPRISE_PROJECT_TYPE_NAMEet PROJ_WINPROJ_VERSION_NUMBER.
Remarques
Parce qu'il prend en considération les autorisations utilisateur, la méthode ReadProjectStatus constitue la meilleure méthode pour obtenir une liste de projets. Cette méthode remplit uniquement certains champs dans la table Project . Pour renseigner les autres champs dans la Project , le tableau Task ou des autres tables, utilisent ReadProject avec le GUID du projet souhaité.
La méthode ReadProjectStatus vous permet d'obtenir un projet en utilisant le nom. Vous devez utiliser le nom complet du projet. Pour obtenir un projet par nom uniquement, projGuidGuid.Emptyla valeur, spécifiez la dataStore, transmettez le nom du projet dans projNameet spécifier le type de projet. L'exemple dans CreateProjectFromTemplate utilise la méthode ReadProjectStatus pour récupérer le modèle.
Autorisations Project Server
Autorisation |
Description |
---|---|
Permet à un utilisateur d'afficher le centre de projets dans Project Web App. Autorisation globale. |
|
Permet à un utilisateur d'ouvrir le projet spécifié. Obligatoire uniquement si elles n'ont pas de ViewProjectCenter. Autorisation de catégorie. |
Exemples
Exemple pour WCF : L'exemple ReadMyProjects effectue les opérations suivantes :
Obtient le GUID de l'utilisateur actuel.
Lit la liste de tous les projets sont visibles par l'utilisateur, à l'aide de ReadProjectStatus.
Lit chaque projet dans la liste, à l'aide de ReadProject.
Si le propriétaire du projet correspond à l'utilisateur actuel :
Copie la ligne du projet dans un ProjectDataSet ayant le même schéma créé par ReadProjectStatus.
Copie la ligne du projet à un second ProjectDataSet dont le schéma terminé.
Ajoute des données de la tâche sélectionnée dans le projet à l' TaskDataTable.
Écrit chaque résultat ProjectDataSet vers un fichier XML, pour la comparaison de schémas.
Par exemple, la sortie du Gestionnaire d'exceptions, voir l'exemple de Code pour la section WCF dans Codes d’erreur de Project Server 2013.
Conseil
S'il existe un grand nombre de projets à lire, une requête de la base de données de création de rapports peut être plus efficace. Alternativement, une extension PSI peut effectuer tous les appels à ReadProjectStatus et ReadProject sur le serveur et retourner seulement la dernière ProjectDataSet.
Pour plus d'informations sur l'utilisation de l'exemple de code dans un projet Microsoft Visual Studio 2010 et création d'un fichier app.config pour la configuration des points de terminaison WCF, consultez la rubrique Prerequisites for WCF-Based Code Samples.
using System;
using System.Text;
using System.ServiceModel;
using System.Xml;
using PSLibrary = Microsoft.Office.Project.Server.Library;
namespace Microsoft.SDK.Project.Samples.ReadMyProjects
{
class Program
{
private const string ENDPOINT_PROJECT = "basicHttp_Project";
private const string ENDPOINT_RESOURCE = "basicHttp_Resource";
// Change the output directory for your computer.
private const string OUTPUT_FILES = @"C:\Project\Samples\Output\";
private const string XML_FILE = "MyProjects.xml";
private const string XML_FILE2 = "MyProjects2.xml";
private static SvcProject.ProjectClient projectClient;
private static SvcResource.ResourceClient resourceClient;
static void Main(string[] args)
{
string outFilePath = OUTPUT_FILES + XML_FILE;
string outFilePath2 = OUTPUT_FILES + XML_FILE2;
try
{
ConfigClientEndpoints(ENDPOINT_PROJECT);
ConfigClientEndpoints(ENDPOINT_RESOURCE);
Guid myUid = resourceClient.GetCurrentUserUid();
Console.WriteLine("My GUID: {0}", myUid.ToString());
// Get the list of all projects visible to the user.
SvcProject.ProjectDataSet projectDs = projectClient.ReadProjectStatus(
Guid.Empty, SvcProject.DataStoreEnum.WorkingStore,
string.Empty, (int)PSLibrary.Project.ProjectType.Project);
SvcProject.ProjectDataSet tempProjDs = null;
// Create an empty ProjectDataSet for projects the user owns.
// By cloning the projectDs object, you get the same schema
// that is created by ReadProjectStatus.
SvcProject.ProjectDataSet myProjectsDs =
(SvcProject.ProjectDataSet)projectDs.Clone();
// Create an empty ProjectDataSet that contains the complete schema.
SvcProject.ProjectDataSet myProjectsDs2 = new SvcProject.ProjectDataSet();
Console.WriteLine("Projects I own:");
for (int i = 0; i < projectDs.Project.Count; i++)
{
tempProjDs = projectClient.ReadProject(projectDs.Project[i].PROJ_UID,
SvcProject.DataStoreEnum.WorkingStore);
if (tempProjDs.Project[0].ProjectOwnerID == myUid)
{
Console.WriteLine("\t" + tempProjDs.Project[0].PROJ_NAME);
myProjectsDs.Project.ImportRow(
(SvcProject.ProjectDataSet.ProjectRow)tempProjDs.Project[0]);
myProjectsDs2.Project.ImportRow(
(SvcProject.ProjectDataSet.ProjectRow)tempProjDs.Project[0]);
// You can add task data to either ProjectDataSet. However,
// only myProjectsDs2 contains the complete Project table schema.
for (int t = 0; t < tempProjDs.Task.Count; t++)
{
// To get all of the task data, use the following statement
// instead of adding a new task row with specific fields.
//myProjectsDs2.Task.ImportRow(
// (SvcProject.ProjectDataSet.TaskRow)tempProjDs.Task[t]);
// Add specific data in a new task row.
SvcProject.ProjectDataSet.TaskRow taskRow =
myProjectsDs2.Task.NewTaskRow();
// If you comment-out the following line, you get a constraint error.
taskRow.PROJ_UID = tempProjDs.Task[t].PROJ_UID;
taskRow.TASK_UID = tempProjDs.Task[t].TASK_UID;
taskRow.TASK_NAME = tempProjDs.Task[t].TASK_NAME;
taskRow.TASK_IS_MANUAL = tempProjDs.Task[t].TASK_IS_MANUAL;
myProjectsDs2.Task.AddTaskRow(taskRow);
}
}
}
Console.WriteLine(
"\nXML output of myProjectsDs and myProjectDs2:\n\t{0}",
outFilePath);
// Write both XML files for comparison of the ProjectDataSet schemas.
myProjectsDs.WriteXml(outFilePath);
myProjectsDs2.WriteXml(outFilePath2);
}
catch (FaultException fault)
{
// Use the WCF FaultException, because the ASMX SoapException does not
// exist in a WCF-based application.
WriteFaultOutput(fault);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.Write("\nPress any key to exit... ");
Console.ReadKey(true);
}
// Extract a PSClientError object from the WCF FaultException object, and
// then display the exception details and each error in the PSClientError stack.
private static void WriteFaultOutput(FaultException fault)
{
string errAttributeName;
string errAttribute;
string errOut;
string errMess = "".PadRight(30, '=') + "\r\n"
+ "Error details: " + "\r\n";
PSLibrary.PSClientError error = Helpers.GetPSClientError(fault, out errOut);
errMess += errOut;
PSLibrary.PSErrorInfo[] errors = error.GetAllErrors();
PSLibrary.PSErrorInfo thisError;
for (int i = 0; i < errors.Length; i++)
{
thisError = errors[i];
errMess += "\r\n".PadRight(30, '=') + "\r\nPSClientError output:\r\n";
errMess += thisError.ErrId.ToString() + "\n";
for (int j = 0; j < thisError.ErrorAttributes.Length; j++)
{
errAttributeName = thisError.ErrorAttributeNames()[j];
errAttribute = thisError.ErrorAttributes[j];
errMess += "\r\n\t" + errAttributeName
+ ": " + errAttribute;
}
}
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(errMess);
Console.ResetColor();
}
// Use the endpoints defined in app.config to configure the client.
public static void ConfigClientEndpoints(string endpt)
{
if (endpt == ENDPOINT_PROJECT)
projectClient = new SvcProject.ProjectClient(endpt);
else if (endpt == ENDPOINT_RESOURCE)
resourceClient = new SvcResource.ResourceClient(endpt);
}
}
// Helper method: GetPSClientError.
class Helpers
{
/// <summary>
/// Extract a PSClientError object from the ServiceModel.FaultException,
/// for use in output of the GetPSClientError stack of errors.
/// </summary>
/// <param name="e"></param>
/// <param name="errOut">Shows that FaultException has more information
/// about the errors than PSClientError has. FaultException can also contain
/// other types of errors, such as failure to connect to the server.</param>
/// <returns>PSClientError object, for enumerating errors.</returns>
public static PSLibrary.PSClientError GetPSClientError(FaultException e,
out string errOut)
{
const string PREFIX = "GetPSClientError() returns null: ";
errOut = string.Empty;
PSLibrary.PSClientError psClientError = null;
if (e == null)
{
errOut = PREFIX + "Null parameter (FaultException e) passed in.";
psClientError = null;
}
else
{
// Get a ServiceModel.MessageFault object.
var messageFault = e.CreateMessageFault();
if (messageFault.HasDetail)
{
using (var xmlReader = messageFault.GetReaderAtDetailContents())
{
var xml = new XmlDocument();
xml.Load(xmlReader);
var serverExecutionFault = xml["ServerExecutionFault"];
if (serverExecutionFault != null)
{
var exceptionDetails = serverExecutionFault["ExceptionDetails"];
if (exceptionDetails != null)
{
try
{
errOut = exceptionDetails.InnerXml + "\r\n";
psClientError =
new PSLibrary.PSClientError(exceptionDetails.InnerXml);
}
catch (InvalidOperationException ex)
{
errOut = PREFIX + "Unable to convert fault exception info ";
errOut += "a valid Project Server error message. Message: \n\t";
errOut += ex.Message;
psClientError = null;
}
}
else
{
errOut = PREFIX
+ "The FaultException e is a ServerExecutionFault, "
+ "but does not have ExceptionDetails.";
}
}
else
{
errOut = PREFIX
+ "The FaultException e is not a ServerExecutionFault.";
}
}
}
else // No detail in the MessageFault.
{
errOut = PREFIX + "The FaultException e does not have any detail.";
}
}
errOut += "\r\n" + e.ToString() + "\r\n";
return psClientError;
}
}
}
Exemple pour ASMX : L'exemple suivant crée un exemple de projet, puis obtient l'état de tous les projets dans le magasin de travail et les signale à la console.
Pour plus d'informations sur l'exécution de cet exemple de code critiques, voir Prerequisites for ASMX-Based Code Samples.
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Web.Services.Protocols;
using System.Threading;
using PSLibrary = Microsoft.Office.Project.Server.Library;
namespace Microsoft.SDK.Project.Samples.ReadProjectStatus
{
class Program
{
[STAThread]
static void Main()
{
try
{
#region Setup
const string PROJECT_SERVER_URI = "https://ServerName/ProjectServerName/";
const string PROJECT_SERVICE_PATH = "_vti_bin/psi/project.asmx";
const string QUEUESYSTEM_SERVICE_PATH = "_vti_bin/psi/queuesystem.asmx";
// Set up the web service objects.
SvcProject.Project projectSvc = new SvcProject.Project();
projectSvc.Url = PROJECT_SERVER_URI + PROJECT_SERVICE_PATH;
projectSvc.Credentials = CredentialCache.DefaultCredentials;
SvcQueueSystem.QueueSystem q = new SvcQueueSystem.QueueSystem();
q.Url = PROJECT_SERVER_URI + QUEUESYSTEM_SERVICE_PATH;
q.Credentials = CredentialCache.DefaultCredentials;
// Create a sample project.
Console.WriteLine("Creating sample project");
Guid projectId = CreateSampleProject(projectSvc, q);
#endregion
#region Read Project Status
// Read all the projects.
Console.WriteLine("Read the projects");
SvcProject.ProjectDataSet readProjDs = projectSvc.ReadProjectStatus(Guid.Empty, SvcProject.DataStoreEnum.WorkingStore,string.Empty,(int) PSLibrary.Project.ProjectType.Project);
#endregion
#region Write out projects
Console.ForegroundColor = ConsoleColor.DarkCyan;
foreach (SvcProject.ProjectDataSet.ProjectRow project in readProjDs.Project)
{
Console.WriteLine(project.PROJ_NAME + " was last saved " + project.PROJ_LAST_SAVED);
}
Console.ResetColor();
#endregion
}
#region Exception Handling and Final
catch (SoapException ex)
{
PSLibrary.PSClientError error = new PSLibrary.PSClientError(ex);
PSLibrary.PSErrorInfo[] errors = error.GetAllErrors();
string errMess = "==============================\r\nError: \r\n";
for (int i = 0; i < errors.Length; i++)
{
errMess += "\n" + ex.Message.ToString() + "\r\n";
errMess += "".PadRight(30, '=') + "\r\nPSCLientError Output:\r\n \r\n";
errMess += errors[i].ErrId.ToString() + "\n";
for (int j = 0; j < errors[i].ErrorAttributes.Length; j++)
{
errMess += "\r\n\t" + errors[i].ErrorAttributeNames()[j] + ": " + errors[i].ErrorAttributes[j];
}
errMess += "\r\n".PadRight(30, '=');
}
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(errMess);
}
catch (WebException ex)
{
string errMess = ex.Message.ToString() +
"\n\nLog on, or check the Project Server Queuing Service";
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Error: " + errMess);
}
catch (Exception ex)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Error: " + ex.Message);
}
finally
{
Console.ResetColor();
Console.WriteLine("\r\n\r\nPress any key...");
Console.ReadKey();
}
#endregion
}
static private void WaitForQueue(SvcQueueSystem.QueueSystem q, Guid jobId)
{
SvcQueueSystem.JobState jobState;
const int QUEUE_WAIT_TIME = 2; // two seconds
bool jobDone = false;
string xmlError = string.Empty;
int wait = 0;
// Wait for the project to get through the queue.
// Get the estimated wait time in seconds.
wait = q.GetJobWaitTime(jobId);
// Wait for it.
Thread.Sleep(wait * 1000);
// Wait until it is finished.
do
{
// Get the job state.
jobState = q.GetJobCompletionState(jobId, out xmlError);
if (jobState == SvcQueueSystem.JobState.Success)
{
jobDone = true;
}
else
{
if (jobState == SvcQueueSystem.JobState.Unknown
|| jobState == SvcQueueSystem.JobState.Failed
|| jobState == SvcQueueSystem.JobState.FailedNotBlocking
|| jobState == SvcQueueSystem.JobState.CorrelationBlocked
|| jobState == SvcQueueSystem.JobState.Canceled)
{
// If the job failed, error out.
throw (new ApplicationException("Queue request " + jobState + " for Job ID " + jobId + ".\r\n" + xmlError));
}
else
{
Console.WriteLine("Job State: " + jobState + " for Job ID: " + jobId);
Thread.Sleep(QUEUE_WAIT_TIME * 1000);
}
}
}
while (!jobDone);
}
static private Guid CreateSampleProject(SvcProject.Project projectSvc,SvcQueueSystem.QueueSystem q)
{
SvcProject.ProjectDataSet projectDs = new SvcProject.ProjectDataSet();
Guid jobId;
// Create the project.
SvcProject.ProjectDataSet.ProjectRow projectRow = projectDs.Project.NewProjectRow();
projectRow.PROJ_UID = Guid.NewGuid();
projectRow.PROJ_NAME = "Its a wonderful project at " +
DateTime.Now.ToShortDateString().Replace("/", "") + " " +
DateTime.Now.ToShortTimeString().Replace(":", "");
projectRow.PROJ_TYPE = (int)PSLibrary.Project.ProjectType.Project;
projectDs.Project.AddProjectRow(projectRow);
// Add some tasks.
SvcProject.ProjectDataSet.TaskRow taskOne = projectDs.Task.NewTaskRow();
taskOne.PROJ_UID = projectRow.PROJ_UID;
taskOne.TASK_UID = Guid.NewGuid();
// The Task Duration format must be specified.
taskOne.TASK_DUR_FMT = (int)PSLibrary.Task.DurationFormat.Day;
taskOne.TASK_DUR = 4800; // 8 hours in duration units (minute/10)
taskOne.TASK_NAME = "Task One";
taskOne.TASK_START_DATE = System.DateTime.Now.AddDays(1);
projectDs.Task.AddTaskRow(taskOne);
SvcProject.ProjectDataSet.TaskRow taskTwo = projectDs.Task.NewTaskRow();
taskTwo.PROJ_UID = projectRow.PROJ_UID;
taskTwo.TASK_UID = Guid.NewGuid();
// The Task Duration format must be specified.
taskTwo.TASK_DUR_FMT = (int)PSLibrary.Task.DurationFormat.Day;
taskTwo.TASK_DUR = 4800; // 8 hours in duration units (minute/10)
taskTwo.TASK_NAME = "Task Two";
taskTwo.TASK_START_DATE = System.DateTime.Now.AddDays(1);
projectDs.Task.AddTaskRow(taskTwo);
//Add some resources.
SvcProject.ProjectDataSet.ProjectResourceRow resourceOne = projectDs.ProjectResource.NewProjectResourceRow();
resourceOne.PROJ_UID = projectRow.PROJ_UID;
resourceOne.RES_UID = Guid.NewGuid();
resourceOne.RES_NAME = "Brynja Sigrídur Blomsterberg";
resourceOne.RES_INITIALS = "BSB";
projectDs.ProjectResource.AddProjectResourceRow(resourceOne);
CreateAssignment(projectDs, taskOne.TASK_UID, resourceOne.RES_UID);
CreateAssignment(projectDs, taskTwo.TASK_UID, resourceOne.RES_UID);
SvcProject.ProjectDataSet.ProjectResourceRow resourceTwo = projectDs.ProjectResource.NewProjectResourceRow();
resourceTwo.PROJ_UID = projectRow.PROJ_UID;
resourceTwo.RES_UID = Guid.NewGuid();
resourceTwo.RES_NAME = "Ioannis Xylaras";
resourceTwo.RES_INITIALS = "IX";
projectDs.ProjectResource.AddProjectResourceRow(resourceTwo);
CreateAssignment(projectDs, taskOne.TASK_UID, resourceTwo.RES_UID);
CreateAssignment(projectDs, taskTwo.TASK_UID, resourceTwo.RES_UID);
// Save the project to the database.
jobId = Guid.NewGuid();
projectSvc.QueueCreateProject(jobId, projectDs, false);
WaitForQueue(q, jobId);
return projectRow.PROJ_UID;
}
private static void CreateAssignment(SvcProject.ProjectDataSet projectDs, Guid taskGuid, Guid resourceGuid)
{
SvcProject.ProjectDataSet.AssignmentRow assnRow = projectDs.Assignment.NewAssignmentRow();
assnRow.PROJ_UID = projectDs.Project[0].PROJ_UID;
assnRow.ASSN_UID = Guid.NewGuid();
assnRow.TASK_UID = taskGuid;
assnRow.RES_UID = resourceGuid;
projectDs.Assignment.AddAssignmentRow(assnRow);
}
}
}