Project::QueuePublish method
Moves the project from the Drafts database and saves it to the Published database.
Namespace: WebSvcProject
Assembly: ProjectServerServices (in ProjectServerServices.dll)
Parameters
- jobUid
- Type: System.Guid
The GUID of the queue job.
- projectUid
- Type: System.Guid
The GUID of the project.
- fullPublish
- Type: System.Boolean
If True, removes any previous data saved for this project in the Published database before publishing.
- WssURL
- Type: System.String
The URL of the SharePoint site to be created for the project.
Return value
Type: WebSvcProject.ProjectRelationsDataSetContains information about any parent projects that contain the current project as a subproject.
QueuePublish is an asynchronous method that sends a publish message to the Project Server Queuing Service.
Following are options for the WssURL parameter:
If WssURL is a null value, QueuePublish does not create a project site for the published project.
If WssURL is String.Empty, QueuePublish creates the default project site with the name of the project. For example, if the base project team site is http://ServerName and the project name is Project Name, the project project site home page is http://ServerName/Project%20Name/default.aspx.
If WssURL is New Name, the project project site name is New Name instead of the project name.
If WssURL is subsite/Project Name, the subsite must exist in the SharePoint farm. If the subsite does not exist, Project Server returns error 16407 (WSSWebHierarchyDoesNotExist).
Project Server Permissions
Permission | Description |
|---|---|
Allows a user to publish the specified project. Category permission. |
The following example creates a sample project and then publishes it.
For critical information about running this code sample, see Prerequisites for ASMX-based code samples in Project 2013.
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.QueuePublish { class Program { [STAThread] static void Main(string[] args) { try { #region Setup const string PROJECT_SERVER_URI = "http://ServerName/ProjectServerName/"; const string PROJECT_SERVICE_PATH = "_vti_bin/psi/project.asmx"; const string QUEUESYSTEM_SERVICE_PATH = "_vti_bin/psi/queuesystem.asmx"; Guid jobId; // Set up the web service objects. SvcProject.Project projectSvc = new SvcProject.Project(); SvcProject.ProjectDataSet projectDs = new SvcProject.ProjectDataSet(); 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.UseDefaultCredentials = true; // Create a sample project. Console.WriteLine("Creating sample project"); Guid projectId = CreateSampleProject(projectSvc, q); #endregion #region Publish Project // Publish the project. Console.WriteLine("Publishing project"); jobId = Guid.NewGuid(); projectSvc.QueuePublish(jobId, projectId, true, String.Empty); WaitForQueue(q, jobId); #endregion } #region Exceptions 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); // Save the project to the database. jobId = Guid.NewGuid(); projectSvc.QueueCreateProject(jobId, projectDs, false); WaitForQueue(q, jobId); return projectRow.PROJ_UID; } } }