Click or drag to resize

PortalUserGetContentAsync Method

Gets the folders and items that are stored at the user's root folder.

Namespace:  Esri.ArcGISRuntime.Portal
Assembly:  Esri.ArcGISRuntime (in Esri.ArcGISRuntime.dll) Version: 100.11.0
public Task<PortalUserContent> GetContentAsync()

Return Value

Type: TaskPortalUserContent
The task object representing the asynchronous get items operation. The value of the task result contains a PortalUserContent object.

The purpose of this Method is to obtain content (items and folders) that belong to a particular authenticated user in a portal. This method performs an asynchronous request to obtain a PortalUserContent object for the logged in user. You cannot use anonymous access to obtain a Portal.PortalUser object and use this Method to obtain valid results. As AGOL/ArcGIS Portal require the use of long term tokens to access secured user information.

To retrieve portal items from folders other than the root use GetContentAsync(String, CancellationToken).



Example Name: SearchPortalMaps

Find webmap portal items by using a search term.

Code example screen shot.

// Copyright 2017 Esri.
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
// You may obtain a copy of the License at:
// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an 
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific 
// language governing permissions and limitations under the License.

using Esri.ArcGISRuntime.Mapping;
using Esri.ArcGISRuntime.Portal;
using Esri.ArcGISRuntime.Security;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using System.Windows.Threading;
using Esri.ArcGISRuntime;

namespace ArcGISRuntime.WPF.Samples.SearchPortalMaps
        name: "Search for webmap",
        category: "Map",
        description: "Find webmap portal items by using a search term.",
        instructions: "Enter search terms into the search bar. Once the search is complete, a list is populated with the resultant webmaps. Tap on a webmap to set it to the map view. Scrolling to the bottom of the webmap recycler view will get more results.",
        tags: new[] { "keyword", "query", "search", "webmap" })]
    public partial class SearchPortalMaps
        // Variables for OAuth with default values ...
        // URL of the server to authenticate with (ArcGIS Online)
        private const string ArcGISOnlineUrl = "";

        // Client ID for the app registered with the server (Portal Maps)
        private string _appClientId = "2Gh53JRzkPtOENQq";

        // Redirect URL after a successful authorization (configured for the Portal Maps application)
        private string _oAuthRedirectUrl = "";

        // Constructor for sample class
        public SearchPortalMaps()

            // Show the OAuth settings in the page
            ClientIdTextBox.Text = _appClientId;
            RedirectUrlTextBox.Text = _oAuthRedirectUrl;

            // Display a default map

        private void DisplayDefaultMap()
            // Create a new Map instance
            Map myMap = new Map(BasemapStyle.ArcGISLightGray);

            // Provide Map to the MapView
            MyMapView.Map = myMap;

        private async void SearchButton_Click(object sender, RoutedEventArgs e)
                // Get web map portal items in the current user's folder or from a keyword search
                IEnumerable<PortalItem> mapItems;
                ArcGISPortal portal;

                // See if the user wants to search public web map items
                if (SearchPublicMaps.IsChecked == true)
                    // Connect to the portal (anonymously)
                    portal = await ArcGISPortal.CreateAsync();

                    // Create a query expression that will get public items of type 'web map' with the keyword(s) in the items tags
                    string queryExpression = string.Format("tags:\"{0}\" access:public type: (\"web map\" NOT \"web mapping application\")", SearchText.Text);

                    // Create a query parameters object with the expression and a limit of 10 results
                    PortalQueryParameters queryParams = new PortalQueryParameters(queryExpression, 10);

                    // Search the portal using the query parameters and await the results
                    PortalQueryResultSet<PortalItem> findResult = await portal.FindItemsAsync(queryParams);

                    // Get the items from the query results
                    mapItems = findResult.Results;
                    // Call a sub that will force the user to log in to ArcGIS Online (if they haven't already)
                    bool loggedIn = await EnsureLoggedInAsync();
                    if (!loggedIn) { return; }

                    // Connect to the portal (will connect using the provided credentials)
                    portal = await ArcGISPortal.CreateAsync(new Uri(ArcGISOnlineUrl));

                    // Get the user's content (items in the root folder and a collection of sub-folders)
                    PortalUserContent myContent = await portal.User.GetContentAsync();

                    // Get the web map items in the root folder
                    mapItems = from item in myContent.Items where item.Type == PortalItemType.WebMap select item;

                    // Loop through all sub-folders and get web map items, add them to the mapItems collection
                    foreach (PortalFolder folder in myContent.Folders)
                        IEnumerable<PortalItem> folderItems = await portal.User.GetContentAsync(folder.FolderId);
                        mapItems = mapItems.Concat(from item in folderItems where item.Type == PortalItemType.WebMap select item);

                // Show the web map portal items in the list box
                MapListBox.ItemsSource = mapItems;
            catch (Exception ex)
                MessageBox.Show(ex.ToString(), "Error");

        private void LoadMapButtonClick(object sender, RoutedEventArgs e)
            // Get the selected web map item in the list box
            PortalItem selectedMap = MapListBox.SelectedItem as PortalItem;
            if (selectedMap == null) { return; }

            // Create a new map, pass the web map portal item to the constructor
            Map webMap = new Map(selectedMap);

            // Handle change in the load status (to report load errors)
            webMap.LoadStatusChanged += WebMapLoadStatusChanged;

            // Show the web map in the map view
            MyMapView.Map = webMap;

        private void WebMapLoadStatusChanged(object sender, Esri.ArcGISRuntime.LoadStatusEventArgs e)
            // Report errors if map failed to load
            if(e.Status == LoadStatus.FailedToLoad)
                Map map = (Map)sender;
                Exception err = map.LoadError;
                if(err != null)
                    MessageBox.Show(err.Message, "Map Load Error");

        private void RadioButtonUnchecked(object sender, RoutedEventArgs e)
            // When the search/user radio buttons are unchecked, clear the list box
            MapListBox.ItemsSource = null;

            // Set the map to the default (if necessary)
            if (MyMapView.Map.Item != null)

        private async Task<bool> EnsureLoggedInAsync()
            bool loggedIn = false;

                // Create a challenge request for portal credentials (OAuth credential request for
                CredentialRequestInfo challengeRequest = new CredentialRequestInfo

                    // Use the OAuth implicit grant flow
                    GenerateTokenOptions = new GenerateTokenOptions
                        TokenAuthenticationType = TokenAuthenticationType.OAuthImplicit

                    // Indicate the url (portal) to authenticate with (ArcGIS Online)
                    ServiceUri = new Uri(ArcGISOnlineUrl)

                // Call GetCredentialAsync on the AuthenticationManager to invoke the challenge handler
                Credential cred = await AuthenticationManager.Current.GetCredentialAsync(challengeRequest, false);
                loggedIn = cred != null;
            catch (OperationCanceledException)
                // OAuth login was canceled
                // .. ignore this, the user can still search public maps
            catch (Exception ex)
                // Login failure
                MessageBox.Show("Login failed: " + ex.Message);

            return loggedIn;

        private void UpdateAuthenticationManager()
            // Define the server information for ArcGIS Online
            ServerInfo portalServerInfo = new ServerInfo

                // ArcGIS Online URI
                ServerUri = new Uri(ArcGISOnlineUrl),

                // Type of token authentication to use
                TokenAuthenticationType = TokenAuthenticationType.OAuthImplicit

            // Define the OAuth information
            OAuthClientInfo oAuthInfo = new OAuthClientInfo
                ClientId = _appClientId,
                RedirectUri = new Uri(_oAuthRedirectUrl)
            portalServerInfo.OAuthClientInfo = oAuthInfo;

            // Get a reference to the (singleton) AuthenticationManager for the app
            AuthenticationManager thisAuthenticationManager = AuthenticationManager.Current;

            // Register the ArcGIS Online server information with the AuthenticationManager

            // Use the OAuthAuthorize class in this project to create a new web view to show the login UI
            thisAuthenticationManager.OAuthAuthorizeHandler = new OAuthAuthorize();

            // Create a new ChallengeHandler that uses a method in this class to challenge for credentials
            thisAuthenticationManager.ChallengeHandler = new ChallengeHandler(CreateCredentialAsync);

        // ChallengeHandler function that will be called whenever access to a secured resource is attempted
        public async Task<Credential> CreateCredentialAsync(CredentialRequestInfo info)
            Credential credential = null;

                // IOAuthAuthorizeHandler will challenge the user for OAuth credentials
                credential = await AuthenticationManager.Current.GenerateCredentialAsync(info.ServiceUri);
            catch (Exception)
                // Exception will be reported in calling function

            return credential;

        private void SaveOAuthSettingsClicked(object sender, RoutedEventArgs e)
            // Settings were provided, update the configuration settings for OAuth authorization
            _appClientId = ClientIdTextBox.Text.Trim();
            _oAuthRedirectUrl = RedirectUrlTextBox.Text.Trim();

            // Update authentication manager with the OAuth settings

            // Hide the OAuth input, show the search UI
            OAuthSettingsGrid.Visibility = Visibility.Collapsed;
            SearchUI.Visibility = Visibility.Visible;

        private void CancelOAuthSettingsClicked(object sender, RoutedEventArgs e)
            // Warn that browsing user's ArcGIS Online maps won't be available without OAuth settings
            string warning = "Without OAuth settings, you will not be able to browse maps from your ArcGIS Online account.";
            bool noAuth = MessageBox.Show(warning, "No OAuth Settings", MessageBoxButton.OKCancel) == MessageBoxResult.OK;

            if (noAuth)
                // Disable browsing maps from your ArcGIS Online account
                BrowseMyMaps.IsEnabled = false;

                // Hide the OAuth input, show the search UI
                OAuthSettingsGrid.Visibility = Visibility.Collapsed;
                SearchUI.Visibility = Visibility.Visible;

    #region OAuth handler
    public class OAuthAuthorize : IOAuthAuthorizeHandler
        // Window to contain the OAuth UI
        private Window _window;

        // Use a TaskCompletionSource to track the completion of the authorization
        private TaskCompletionSource<IDictionary<string, string>> _tcs;

        // URL for the authorization callback result (the redirect URI configured for your application)
        private string _callbackUrl;

        // URL that handles the OAuth request
        private string _authorizeUrl;

        // Function to handle authorization requests, takes the URIs for the secured service, the authorization endpoint, and the redirect URI
        public Task<IDictionary<string, string>> AuthorizeAsync(Uri serviceUri, Uri authorizeUri, Uri callbackUri)
            if (_tcs != null && !_tcs.Task.IsCompleted)
                throw new Exception("Task in progress");

            _tcs = new TaskCompletionSource<IDictionary<string, string>>();

            // Store the authorization and redirect URLs
            _authorizeUrl = authorizeUri.AbsoluteUri;
            _callbackUrl = callbackUri.AbsoluteUri;

            // Call a function to show the login controls, make sure it runs on the UI thread for this app
            Dispatcher dispatcher = Application.Current.Dispatcher;
            if (dispatcher == null || dispatcher.CheckAccess())
                Action authorizeOnUIAction = () => AuthorizeOnUIThread(_authorizeUrl);

            // Return the task associated with the TaskCompletionSource
            return _tcs.Task;

        // Challenge for OAuth credentials on the UI thread
        private void AuthorizeOnUIThread(string authorizeUri)
            // Create a WebBrowser control to display the authorize page
            WebBrowser webBrowser = new WebBrowser();

            // Handle the navigation event for the browser to check for a response to the redirect URL
            webBrowser.Navigating += WebBrowserOnNavigating;

            // Display the web browser in a new window 
            _window = new Window
                Content = webBrowser,
                Height = 330,
                Width = 295,
                WindowStartupLocation = WindowStartupLocation.CenterOwner

            // Set the app's window as the owner of the browser window (if main window closes, so will the browser)
            if (Application.Current != null && Application.Current.MainWindow != null)
                _window.Owner = Application.Current.MainWindow;

            // Handle the window closed event then navigate to the authorize url
            _window.Closed += OnWindowClosed;

            // Display the Window

        // Handle the browser window closing
        private void OnWindowClosed(object sender, EventArgs e)
            // If the browser window closes, return the focus to the main window
            if (_window != null && _window.Owner != null)

            // If the task wasn't completed, the user must have closed the window without logging in
            if (!_tcs.Task.IsCompleted)
                // Set the task completion source exception to indicate a canceled operation

            _window = null;

        // Handle browser navigation (content changing)
        private void WebBrowserOnNavigating(object sender, NavigatingCancelEventArgs e)
            // Check for a response to the callback url
            const string portalApprovalMarker = "/oauth2/approval";
            WebBrowser webBrowser = sender as WebBrowser;

            Uri uri = e.Uri;

            // If no browser, uri, or an empty url, return
            if (webBrowser == null || uri == null || String.IsNullOrEmpty(uri.AbsoluteUri))

            // Check for redirect
            bool isRedirected = uri.AbsoluteUri.StartsWith(_callbackUrl) ||
                _callbackUrl.Contains(portalApprovalMarker) && uri.AbsoluteUri.Contains(portalApprovalMarker);

            if (isRedirected)
                // Browser was redirected to the callbackUrl (success!)
                //    -close the window 
                //    -decode the parameters (returned as fragments or query)
                //    -return these parameters as result of the Task
                e.Cancel = true;

                // Call a helper function to decode the response parameters
                IDictionary<string,string> authResponse = DecodeParameters(uri);

                // Set the result for the task completion source

                if (_window != null)

        private static IDictionary<string, string> DecodeParameters(Uri uri)
            // Create a dictionary of key value pairs returned in an OAuth authorization response URI query string
            string answer = "";

            // Get the values from the URI fragment or query string
            if (!String.IsNullOrEmpty(uri.Fragment))
                answer = uri.Fragment.Substring(1);
                if (!String.IsNullOrEmpty(uri.Query))
                    answer = uri.Query.Substring(1);

            // Parse parameters into key / value pairs
            Dictionary<string,string> keyValueDictionary = new Dictionary<string, string>();
            string[] keysAndValues = answer.Split(new[] { '&' }, StringSplitOptions.RemoveEmptyEntries);
            foreach (string kvString in keysAndValues)
                string[] pair = kvString.Split('=');
                string key = pair[0];
                string value = string.Empty;
                if (key.Length > 1)
                    value = Uri.UnescapeDataString(pair[1]);

                keyValueDictionary.Add(key, value);

            // Return the dictionary of string keys/values
            return keyValueDictionary;
    d:DesignHeight="600" d:DesignWidth="800">
        <esri:MapView x:Name="MyMapView" />
        <Border Style="{StaticResource BorderStyle}">
                <Grid x:Name="OAuthSettingsGrid"
                        <RowDefinition Height="60" />
                        <RowDefinition Height="40" />
                        <RowDefinition Height="40" />
                        <RowDefinition Height="40" />
                        <ColumnDefinition Width="115" />
                        <ColumnDefinition />
                    <TextBlock Text="OAuth Settings"
                               Grid.Row="0" Grid.ColumnSpan="2"
                               VerticalAlignment="Bottom" HorizontalAlignment="Center" />
                    <TextBlock Text="Client ID:"
                               Grid.Row="1" Grid.Column="0"
                               VerticalAlignment="Bottom" HorizontalAlignment="Right" />
                    <TextBox x:Name="ClientIdTextBox"
                             Grid.Row="1" Grid.Column="1"
                             VerticalAlignment="Bottom" HorizontalAlignment="Left"
                             Width="150" Margin="10,0" />
                    <TextBlock Text="Redirect URL:"
                               Grid.Row="2" Grid.Column="0"
                               VerticalAlignment="Top" HorizontalAlignment="Right"
                               Margin="0,10" />
                    <TextBox x:Name="RedirectUrlTextBox"
                             Grid.Row="2" Grid.Column="1"
                             VerticalAlignment="Top" HorizontalAlignment="Left"
                             Width="150" Margin="10" />
                    <Button Content="Cancel"
                            Grid.Row="3" Grid.Column="0"
                            Width="70" Height="25" Margin="10,0"
                            VerticalAlignment="Center" HorizontalAlignment="Center"
                            Click="CancelOAuthSettingsClicked" />
                    <Button Content="Save OAuth Settings"
                            Grid.Row="3" Grid.Column="1"
                            Width="150" Height="25" Margin="10,0"
                            VerticalAlignment="Center" HorizontalAlignment="Left"
                            Click="SaveOAuthSettingsClicked" />
                <Grid x:Name="SearchUI" Visibility="Collapsed">
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <RowDefinition />
                        <RowDefinition />
                        <RowDefinition />
                        <RowDefinition Height="100" />
                        <RowDefinition />
                    <RadioButton x:Name="SearchPublicMaps"
                                 Grid.Column="0" Grid.Row="0"
                                 Content="Search public maps:"
                                 Unchecked="RadioButtonUnchecked" />
                    <TextBox x:Name="SearchText"
                             Grid.Column="1" Grid.Row="0"
                             IsEnabled="{Binding ElementName=SearchPublicMaps, Path=IsChecked}" />
                    <RadioButton x:Name="BrowseMyMaps"
                                 Grid.Column="0" Grid.Row="1"
                                 Content="Browse my maps" />
                    <Button x:Name="SearchButton"
                            Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2"
                            Content="Get maps"
                            Click="SearchButton_Click" />
                    <ListBox x:Name="MapListBox"
                             Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="2"
                    <Button x:Name="LoadMapButton"
                            Grid.Column="0" Grid.Row="4" Grid.ColumnSpan="2"
                            Content="Load selected map"
                            Click="LoadMapButtonClick" />
See Also
Additional Examples
Hyperlink to ExampleDescription
SearchPortalMapsFind webmap portal items by using a search term.