Project.UpdateProjectWorkspaceAddress Method
Updates the project site URL and name in a SharePoint site.
Namespace: [Project Web service]
Service reference: http://ServerName:32843/[Project Service Application GUID]/PSI/Project.svc
Web service reference: http://ServerName/ProjectServerName/_vti_bin/PSI/Project.asmx?wsdl
Syntax
'Declaration
<SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/Project/UpdateProjectWorkspaceAddress", 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 Sub UpdateProjectWorkspaceAddress ( _
projectUid As Guid, _
newWebName As String, _
newWSSServerUID As Guid _
)
'Usage
Dim instance As Project
Dim projectUid As Guid
Dim newWebName As String
Dim newWSSServerUID As Guid
instance.UpdateProjectWorkspaceAddress(projectUid, _
newWebName, newWSSServerUID)
[SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/Project/UpdateProjectWorkspaceAddress", 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 void UpdateProjectWorkspaceAddress(
Guid projectUid,
string newWebName,
Guid newWSSServerUID
)
Parameters
- projectUid
Type: System.Guid
The project GUID.
- newWebName
Type: System.String
The new name of the project site.
- newWSSServerUID
Type: System.Guid
The GUID of the new SharePoint Server.
Remarks
The target project site must exist or a WSSWebDoesNotExist error is thrown. CreateWssSite will create a new site for a given project.
If the new project site is already in use, a WSSSpWebAlreadyLinkedToProject error is thrown.
The specified project must exist in the Published database.
Project Server Permissions
Permission |
Description |
---|---|
Allows a user to manage SharePoint sites for Project Server. Global permission. |
Examples
The following example creates a new project, publishes it, and then changes the project site association to be one that you created.
For critical information about running this code sample, see Prerequisites for ASMX-Based Code Samples.
You will need to create a Project Server project site to use in the example. It will serve as the new project site for this project.
Open your Project Web App site (https://ServerName/ProjectServerName/.
On the upper-right, click Site Actions. Choose Create.
Under Web Pages, click Sites and Workspaces.
Enter a Title, Description, and URL Name.
Make a note of the URL Name that you entered; you need it for the example below.
Select the Microsoft Office Project Workspace template.
Click Create.
Set the value of NEW WORKSPACE in the sample to match the URL Name that you entered previously.
If you run the example two times in a row, you will get an error. That is because the site that you made previously becomes associated with the project that you create in the sample. You can either use the Project Web AppServer Settings area to delete the project that was just created (https://ServerName/ProjectServerName/admin/admin.aspx), or you can add an UpdateProjectWorkspaceAddress call to set the project site of the previous project to string.Empty.
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.UpdateProjectWorkspaceAddress
{
class Program
{
[STAThread]
static void Main()
{
try
{
#region Setup
// Replace the NEW_WORKSPACE value with the workspace name
// that you created above.
const string NEW_WORKSPACE = "NEW WORKSPACE";
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";
const string WSSINTEROP_SERVICE_PATH = "_vti_bin/psi/wssinterop.asmx";
const string SESSION_DESC = "Update Workspace Sample";
Guid sessionId = Guid.NewGuid();
Guid jobId;
// Set up the web service objects.
ProjectWebSvc.Project projectSvc = new ProjectWebSvc.Project();
projectSvc.Url = PROJECT_SERVER_URI + PROJECT_SERVICE_PATH;
projectSvc.Credentials = CredentialCache.DefaultCredentials;
QueueSystemWebSvc.QueueSystem q = new QueueSystemWebSvc.QueueSystem();
q.Url = PROJECT_SERVER_URI + QUEUESYSTEM_SERVICE_PATH;
q.Credentials = CredentialCache.DefaultCredentials;
WssInteropWebSvc.WssInterop wssInterOpSvc = new WssInteropWebSvc.WssInterop();
wssInterOpSvc.Url = PROJECT_SERVER_URI + WSSINTEROP_SERVICE_PATH;
wssInterOpSvc.Credentials = CredentialCache.DefaultCredentials;
// Create a sample project.
Console.WriteLine("Creating the project");
Guid projectId = CreateSampleProject(projectSvc, q);
Console.WriteLine("\tProject UID: " + projectId);
// Publish the project.
Console.WriteLine("Publishing the project");
jobId = Guid.NewGuid();
projectSvc.QueuePublish(jobId, projectId, true, SESSION_DESC);
WaitForQueue(q, jobId);
#endregion
#region Get workspace info
// Get the admin settings that are necessary for site linking.
Console.WriteLine("Getting the server info");
WssInteropWebSvc.WssSettingsDataSet dsCurrentWssInfo = wssInterOpSvc.ReadWssSettings();
WssInteropWebSvc.WssSettingsDataSet.WssAdminRow adminRow = dsCurrentWssInfo.WssAdmin[0];
Guid wssWebAppUid = adminRow.WADMIN_CURRENT_STS_SERVER_UID;
string siteCollection = string.Empty;
if (!adminRow.IsWADMIN_DEFAULT_SITE_COLLECTIONNull())
{
siteCollection = adminRow.WADMIN_DEFAULT_SITE_COLLECTION;
}
#endregion
#region Change Workspace Address
Console.WriteLine("Changing the address");
projectSvc.UpdateProjectWorkspaceAddress(projectId, siteCollection + "/"+ NEW_WORKSPACE , wssWebAppUid);
#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
}
#region Supporting Classes
// Wait for the job to finish.
// Outputs job status to the console.
static private void WaitForQueue(QueueSystemWebSvc.QueueSystem q, Guid jobId)
{
QueueSystemWebSvc.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 == QueueSystemWebSvc.JobState.Success)
{
jobDone = true;
}
else
{
if (jobState == QueueSystemWebSvc.JobState.Unknown
|| jobState == QueueSystemWebSvc.JobState.Failed
|| jobState == QueueSystemWebSvc.JobState.FailedNotBlocking
|| jobState == QueueSystemWebSvc.JobState.CorrelationBlocked
|| jobState == QueueSystemWebSvc.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(ProjectWebSvc.Project projectSvc, QueueSystemWebSvc.QueueSystem q)
{
ProjectWebSvc.ProjectDataSet projectDs = new ProjectWebSvc.ProjectDataSet();
Guid jobId;
// Create the project.
ProjectWebSvc.ProjectDataSet.ProjectRow projectRow = projectDs.Project.NewProjectRow();
Guid projectId = Guid.NewGuid();
projectRow.PROJ_UID = projectId;
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.
ProjectWebSvc.ProjectDataSet.TaskRow taskOne = projectDs.Task.NewTaskRow();
taskOne.PROJ_UID = projectId;
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);
ProjectWebSvc.ProjectDataSet.TaskRow taskTwo = projectDs.Task.NewTaskRow();
taskTwo.PROJ_UID = projectId;
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";
projectDs.Task.AddTaskRow(taskTwo);
// Make task two dependent on task one.
ProjectWebSvc.ProjectDataSet.DependencyRow dependency = projectDs.Dependency.NewDependencyRow();
dependency.LINK_UID = Guid.NewGuid();
dependency.PROJ_UID = projectId;
dependency.LINK_PRED_UID = taskOne.TASK_UID;
dependency.LINK_SUCC_UID = taskTwo.TASK_UID;
dependency.LINK_TYPE = 1; //Finish to Start
dependency.LINK_LAG_FMT = (int)PSLibrary.Task.DurationFormat.Hour;
dependency.LINK_LAG = 0;
projectDs.Dependency.AddDependencyRow(dependency);
// Add a summary task.
ProjectWebSvc.ProjectDataSet.TaskRow taskOthers = projectDs.Task.NewTaskRow();
taskOthers.PROJ_UID = projectId;
taskOthers.TASK_UID = Guid.NewGuid();
taskOthers.TASK_NAME = "Other Tasks";
projectDs.Task.AddTaskRow(taskOthers);
// Add some subtasks.
ProjectWebSvc.ProjectDataSet.TaskRow taskThree = projectDs.Task.NewTaskRow();
taskThree.PROJ_UID = projectId;
taskThree.TASK_UID = Guid.NewGuid();
// The Task Duration format must be specified.
taskThree.TASK_DUR_FMT = (int)PSLibrary.Task.DurationFormat.Day;
taskThree.TASK_DUR = 4800; // 8 hours in duration units (minute/10)
taskThree.TASK_NAME = "Task Three";
taskThree.TASK_PARENT_UID = taskOthers.TASK_UID;
taskThree.TASK_OUTLINE_LEVEL = 2;
projectDs.Task.AddTaskRow(taskThree);
ProjectWebSvc.ProjectDataSet.TaskRow taskFour = projectDs.Task.NewTaskRow();
taskFour.PROJ_UID = projectId;
taskFour.TASK_UID = Guid.NewGuid();
// The Task Duration format must be specified.
taskFour.TASK_DUR_FMT = (int)PSLibrary.Task.DurationFormat.Day;
taskFour.TASK_DUR = 4800; // 8 hours in duration units (minute/10)
taskFour.TASK_NAME = "Task Four";
taskFour.TASK_PARENT_UID = taskOthers.TASK_UID;
taskFour.TASK_OUTLINE_LEVEL = 2;
projectDs.Task.AddTaskRow(taskFour);
// Make task four dependent on task three.
dependency = projectDs.Dependency.NewDependencyRow();
dependency.LINK_UID = Guid.NewGuid();
dependency.PROJ_UID = projectId;
dependency.LINK_PRED_UID = taskThree.TASK_UID;
dependency.LINK_SUCC_UID = taskFour.TASK_UID;
dependency.LINK_TYPE = 1; //Finish to Start
dependency.LINK_LAG_FMT = (int)PSLibrary.Task.DurationFormat.Hour;
dependency.LINK_LAG = 0;
projectDs.Dependency.AddDependencyRow(dependency);
// Make others task dependent on task two.
dependency = projectDs.Dependency.NewDependencyRow();
dependency.LINK_UID = Guid.NewGuid();
dependency.PROJ_UID = projectId;
dependency.LINK_PRED_UID = taskTwo.TASK_UID;
dependency.LINK_SUCC_UID = taskOthers.TASK_UID;
dependency.LINK_TYPE = 1; //Finish to Start
dependency.LINK_LAG_FMT = (int)PSLibrary.Task.DurationFormat.Hour;
dependency.LINK_LAG = 0;
projectDs.Dependency.AddDependencyRow(dependency);
//Add some resources.
ProjectWebSvc.ProjectDataSet.ProjectResourceRow resourceOne = projectDs.ProjectResource.NewProjectResourceRow();
resourceOne.PROJ_UID = projectId;
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);
ProjectWebSvc.ProjectDataSet.ProjectResourceRow resourceTwo = projectDs.ProjectResource.NewProjectResourceRow();
resourceTwo.PROJ_UID = projectId;
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);
CreateAssignment(projectDs, taskThree.TASK_UID, resourceTwo.RES_UID);
CreateAssignment(projectDs, taskFour.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;
}
// A helper function for CreateSampleProject.
// Makes simple assignments.
private static void CreateAssignment(ProjectWebSvc.ProjectDataSet projectDs, Guid taskGuid, Guid resourceGuid)
{
ProjectWebSvc.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);
}
#endregion
}
}