Admin::ReadDepartments method
Reads the list of departments that are defined in a Project Web App instance.
Namespace: WebSvcAdmin
Assembly: ProjectServerServices (in ProjectServerServices.dll)
Parameters
- language
- Type: System.Int32
Specifies the primary language identifier (LCID) that indicates the language of a country or region.
You can define departments in the Department lookup table, on the Enterprise custom Fields and Lookup Tables page in Project Web App (http://ServerName/ProjectServerName/_layouts/pwa/Admin/CustomizeFields.aspx).
Project Server Permissions
Permission | Description |
|---|---|
Allows a user to load the enterprise global template. Global permission. | |
Allows a user to add, modify, or delete users and manage Project Server security groups. Global permission. | |
Allows a user to access the Project Center. Global permission. | |
Allows a user to access the Resource Center. Global permission. | |
Allows a user to modify the definitions of enterprise custom fields and lookup table values. Global permission. | |
Allows a user to add a new project to the Project Server database. Global permission. |
The following example shows the use of the ReadDepartments method. The example uses the SvcAdmin namespace in the ProjectServerServices.dll proxy assembly. Code that uses ReadDepartments returns a DepartmentsDataSet; the application writes the results to an XML file.
Note |
|---|
The ConfigClientEndpoints method uses an app.config file for setting the WCF binding, behavior, and endpoint. For information about creating a PSI proxy assembly and an app.config file, see Prerequisites for WCF-based code samples in Project 2013. |
using System; using System.Text; using System.ServiceModel; using System.Xml; using PSLibrary = Microsoft.Office.Project.Server.Library; namespace Microsoft.SDK.Project.Samples.TestAdmin { class Program { private const string ENDPOINT_ADMIN = "basicHttp_Admin"; // Change the output directory to match the output directory of your computer. private const string OUTPUT_FILES = @"E:\Project\Samples\Output\"; private static SvcAdmin.AdminClient adminClient; private static string outFilePath; static void Main(string[] args) { outFilePath = OUTPUT_FILES + "DepartmentsDataSet.xml"; ConfigClientEndpoints(ENDPOINT_ADMIN); int lcid = 1033; // The Department lookup table is in English. try { // Here is the thing that we are trying to do. SvcAdmin.DepartmentsDataSet deptDS = adminClient.ReadDepartments(lcid); deptDS.WriteXml(outFilePath); } catch(FaultException fault) { // Use the WCF FaultException, because the ASMX SoapException does not // exist in a WCF-based application. WriteFaultOutput(fault); } Console.Write("\nPress any key to exit... "); Console.ReadKey(); } // 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 that are defined in app.config to configure the client. public static void ConfigClientEndpoints(string endpt) { if (endpt == ENDPOINT_ADMIN) adminClient = new SvcAdmin.AdminClient(ENDPOINT_ADMIN); } } // 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; } } }
The following is an example of the DepartmentsDataSet.xml output file that the sample application saves.
Note |
|---|
The department names that are returned in the example are specific to departments that are defined in the Project Web App instance. |
<?xml version="1.0" standalone="yes"?>
<DepartmentsDataSet xmlns="http://schemas.microsoft.com/office/project/server/webservices/DepartmentsDataSet/">
<Departments>
<DEPARTMENT_UID>83125fbf-5c09-4b93-800a-09681bbf7612</DEPARTMENT_UID>
<DEPARTMENT_NAME>Marketing</DEPARTMENT_NAME>
<DEPARTMENT_FULLNAME>Marketing</DEPARTMENT_FULLNAME>
</Departments>
<Departments>
<DEPARTMENT_UID>a47930d6-b89d-4f3a-b4e3-522015fe82a1</DEPARTMENT_UID>
<DEPARTMENT_NAME>Testing</DEPARTMENT_NAME>
<DEPARTMENT_FULLNAME>Testing</DEPARTMENT_FULLNAME>
</Departments>
<Departments>
<DEPARTMENT_UID>cca85763-9376-4ef7-b4f2-a2b661b9846b</DEPARTMENT_UID>
<DEPARTMENT_NAME>UA</DEPARTMENT_NAME>
<DEPARTMENT_FULLNAME>UA</DEPARTMENT_FULLNAME>
</Departments>
<Departments>
<DEPARTMENT_UID>41d056ca-497f-4e4a-8855-e118b667fcc8</DEPARTMENT_UID>
<DEPARTMENT_NAME>Planning</DEPARTMENT_NAME>
<DEPARTMENT_FULLNAME>Planning</DEPARTMENT_FULLNAME>
</Departments>
<Departments>
<DEPARTMENT_UID>96e4522f-2d4e-4026-9ec0-ede9c182dda8</DEPARTMENT_UID>
<DEPARTMENT_NAME>Development</DEPARTMENT_NAME>
<DEPARTMENT_FULLNAME>Development</DEPARTMENT_FULLNAME>
</Departments>
</DepartmentsDataSet>
Note