Skip to content

ProSnippets Sharing

UmaHarano edited this page Nov 12, 2025 · 23 revisions
Language:              C#  
Subject:               Sharing  
Contributor:           ArcGIS Pro SDK Team <[email protected]>  
Organization:          Esri, http://www.esri.com  
Date:                  11/7/2025  
ArcGIS Pro:            3.6  
Visual Studio:         2022  

ArcGISPortalManager: Get the Current Active Portal

var active_portal = ArcGISPortalManager.Current.GetActivePortal();
  string uri = active_portal.PortalUri.ToString();

ArcGISPortalManager: Get a list of all your Portals

var portals = ArcGISPortalManager.Current.GetPortals();
  //Make a list of all the Uris
  var portalUris = portals.Select(p => p.PortalUri.ToString()).ToList();

ArcGISPortalManager: Add a portal to the list of portals

var portalUri = new Uri("http://myportal.esri.com/portal/", UriKind.Absolute);
  ArcGISPortalManager.Current.AddPortal(portalUri);

ArcGISPortalManager: Get a portal and Sign In, Set it Active

//Find the portal to sign in with using its Uri...
  var uri = new Uri("http://myportal.esri.com/portal/", UriKind.Absolute);
  var aPortal = ArcGISPortalManager.Current.GetPortal(uri);
  if (!aPortal.IsSignedOn())
  {
    //Calling "SignIn" will trigger the OAuth popup if your credentials are
    //not cached (eg from a previous sign in in the session)
    if (portal.SignIn().success)
    {
      //Set this portal as my active portal
      ArcGISPortalManager.Current.SetActivePortal(portal);
    }
  }

ArcGISPortalManager: Listen for the Portal Events

ArcGIS.Desktop.Core.Events.ActivePortalChangedEvent.Subscribe((args) =>
  {
    var active_uri = args.ActivePortal?.PortalUri.ToString();
    //etc
  });

  ArcGIS.Desktop.Core.Events.ArcGISPortalAddedEvent.Subscribe((args) =>
  {
    var added_portal = args.Portal;
    //etc
  });

  ArcGIS.Desktop.Core.Events.ArcGISPortalRemovedEvent.Subscribe((args) =>
  {
    var old_uri = args.RemovedPortalUri;
    //etc
  });

  ArcGIS.Desktop.Core.Events.PortalSignOnChangedEvent.Subscribe((args) =>
  {
    var portal = args.Portal;
    var isSignedOn = args.IsSignedOn;
    //etc
  });

Portal: Get the Current signed in User from the active portal

//Force login
  if (!portal.IsSignedOn())
  {
    portal.SignIn();
  }
  var user = portal.GetSignOnUsername();

Portal: Get the "online" portal view for the current user

//If no-one is signed in, this will be the default view for
  //the anonymous user.
  var online = ArcGISPortalManager.Current.GetPortal(new Uri("http://www.arcgis.com"));
  var portalInfo = await online.GetPortalInfoAsync();

Portal: Get the organization id for the current user

var myPortal = ArcGISPortalManager.Current.GetPortal(new Uri("https://machine.domain.com/portal/"));
  var portalInfo = await myPortal.GetPortalInfoAsync();
  var orgid = portalInfo.OrganizationId;

Portal: Get the user content for the active user from the active portal

var activePortal = ArcGISPortalManager.Current.GetActivePortal();
  var owner = activePortal.GetSignOnUsername();
  var activeUserContent = await activePortal.GetUserContentAsync(owner);
  //Get content for a specific folder (identified by its folder id)
  //var userContent = await portal.GetUserContentAsync(owner, folderId);

  //Get all the folders
  foreach (var pf in userContent.PortalFolders)
  {
    //Do something with the folders

  }
  //Get all the content items
  foreach (var pi in userContent.PortalItems)
  {
    //Do something with the portal items
  }

Portal: Download any package items in the user content

var packages = new List<PortalItemType>
  {
    PortalItemType.BasemapPackage,
    PortalItemType.GeoprocessingPackage,
    PortalItemType.LayerPackage,
    PortalItemType.LocatorPackage,
    PortalItemType.MapPackage,
    PortalItemType.ProjectPackage,
    PortalItemType.ScenePackage,
    PortalItemType.RulePackage,
    PortalItemType.VectorTilePackage
  };
  var folder = @"E:\Temp\PortalAPITest\";
  //Get the UserContent - refer to the initialization section above for more details
  foreach (var di in userContent.PortalItems.Where(pi => packages.Contains(pi.PortalItemType)))
  {
    var path = System.IO.Path.Combine(folder, di.Name);
    await di.GetItemDataAsync(path);
  }

Portal: Get the groups for the specified user

//elsewhere...
  //var signOnUserName = portal.GetSignOnUsername();
  var groups = await portal.GetGroupsFromUserAsync(signOnUserName);
  foreach (var group in groups)
  {
    //Do something with the portal groups
  }

Portal: Execute a portal search

var owner = portal.GetSignOnUsername();
  var portalInfo = await portal.GetPortalInfoAsync();

  //1. Get all web maps
  var query1 = PortalQueryParameters.CreateForItemsOfType(PortalItemType.WebMap);

  //2. Get all web maps and map services - include user, organization
  // and "usa" in the title
  var query2 = PortalQueryParameters.CreateForItemsOfTypes(new List<PortalItemType>() {
  PortalItemType.WebMap, PortalItemType.MapService}, owner, "", "title:usa");
  query2.OrganizationId = portalInfo.OrganizationId;

  //retrieve in batches of up to a 100 each time
  query2.Limit = 100;

  //Loop until done
  var portalItems = new List<PortalItem>();
  while (query2 != null)
  {
    //run the search
    PortalQueryResultSet<PortalItem> results = await portal.SearchForContentAsync(query2);
    portalItems.AddRange(results.Results);
    query2 = results.NextQueryParameters;
  }
  //process results
  foreach (var pi in portalItems)
  {
    //Do something with the portal items
  }

EsriHttpClient: Get the Current signed on User

//Reference Newtonsoft - Json.Net
  //Reference System.Net.Http
  UriBuilder selfURL = new UriBuilder(ArcGISPortalManager.Current.GetActivePortal().PortalUri)
  {
    Path = "sharing/rest/portals/self",
    Query = "f=json"
  };
  EsriHttpResponseMessage response = new EsriHttpClient().Get(selfURL.Uri.ToString());

  dynamic portalSelf = JObject.Parse(await response.Content.ReadAsStringAsync());
  // if the response doesn't contain the user information then it is essentially
  // an anonymous request against the portal
  if (portalSelf.user == null)
    return;
  string userName = portalSelf.user.username;

Get the Groups for the Current Signed on User

//Assume that you have executed the "Get the Current signed on User" snippet and have 'userName'
  UriBuilder groupsURL = new UriBuilder(ArcGISPortalManager.Current.GetActivePortal().PortalUri)
  {
    Path = String.Format("sharing/rest/community/users/{0}", signOnUserName),
    Query = "f=json"
  };
  var groupResponse = new EsriHttpClient().Get(groupsURL.Uri.ToString());
  dynamic portalGroups = JObject.Parse(await groupResponse.Content.ReadAsStringAsync());

  string groups = portalGroups.groups.ToString();

EsriHttpClient: Query for esri content on the active Portal

//http://www.arcgis.com/sharing/search?q=owner:esri&f=json

  UriBuilder searchURL = new UriBuilder(ArcGISPortalManager.Current.GetActivePortal().PortalUri)
  {
    Path = "sharing/rest/search",
    Query = "q=owner:esri&f=json"
  };
  EsriHttpClient httpClient = new EsriHttpClient();
  var searchResponse = httpClient.Get(searchURL.Uri.ToString());
  dynamic resultItems = JObject.Parse(await searchResponse.Content.ReadAsStringAsync());

  long numberOfTotalItems = resultItems.total.Value;
  long currentCount = 0;

  List<dynamic> resultItemList = new List<dynamic>();
  // store the first results in the list
  resultItemList.AddRange(resultItems.results);
  currentCount = currentCount + resultItems.num.Value;
  //Up to 50
  while (currentCount < numberOfTotalItems && currentCount <= 50)
  {
    searchURL.Query = String.Format("q=owner:esri&start={0}&f=json", resultItems.nextStart.Value);
    searchResponse = httpClient.Get(searchURL.Uri.ToString());
    resultItems = JObject.Parse(await searchResponse.Content.ReadAsStringAsync());
    resultItemList.AddRange(resultItems.results);
    currentCount = currentCount + resultItems.num.Value;
  }

EsriHttpClient: Upload CSV file to ArcGIS Online

// Create the item to be uploaded, based on a local file
  var itemToUpload = ItemFactory.Instance.Create(@"C:\Data\AddToMapCustomItem\AlaskaCitiesXY.csv");
  // Define the tags for the item
  string[] tags = new string[] { "ArcGIS Pro", "SDK", "Internal Demo" };
  // Create the upload definition for the above item
  UploadDefinition uploadDefinition = new UploadDefinition(
    ArcGISPortalManager.Current.GetActivePortal().PortalUri.ToString(),
    itemToUpload,
    tags
    );
  // Upload the item to the Portal
  EsriHttpClient httpClient = new EsriHttpClient();
  var result = httpClient.Upload(uploadDefinition);

  // Manage the result of the operation appropriately
  if (result.Item1 == false)
    return;

EsriHttpClient: Get a Web Map for the Current User and Add it to Pro

UriBuilder searchURL = new UriBuilder(ArcGISPortalManager.Current.GetActivePortal().PortalUri)
  {
    Path = "sharing/rest/portals/self",
    Query = "f=json"
  };
  EsriHttpClient httpClient = new EsriHttpClient();
  EsriHttpResponseMessage response = httpClient.Get(searchURL.Uri.ToString());

  dynamic portalSelf = JObject.Parse(await response.Content.ReadAsStringAsync());
  // if the response doesn't contain the user information then it is essentially
  // an anonymous request against the portal
  if (portalSelf.user == null)
    return;
  string userName = portalSelf.user.username;

  searchURL.Path = "sharing/rest/search";
  string webMaps = "(type:\"Web Map\" OR type:\"Explorer Map\" OR type:\"Web Mapping Application\" OR type:\"Online Map\")";
  searchURL.Query = string.Format("q=owner:{0} {1}&f=json", userName, webMaps);

  var searchResponse = httpClient.Get(searchURL.Uri.ToString());
  dynamic resultItems = JObject.Parse(await searchResponse.Content.ReadAsStringAsync());

  long numberOfTotalItems = resultItems.total.Value;
  if (numberOfTotalItems == 0)
    return;

  List<dynamic> resultItemList = new List<dynamic>();
  resultItemList.AddRange(resultItems.results);
  //get the first result
  dynamic item = resultItemList[0];

  string itemID = item.id;
  Item currentItem = ItemFactory.Instance.Create(itemID, ItemFactory.ItemType.PortalItem);

  if (MapFactory.Instance.CanCreateMapFrom(currentItem))
  {
    Map newMap = MapFactory.Instance.CreateMapFromItem(currentItem);
    await ProApp.Panes.CreateMapPaneAsync(newMap);
  }

EsriHttpClient: Get a Service Layer and Add it to Pro

UriBuilder searchURL = new UriBuilder(ArcGISPortalManager.Current.GetActivePortal().PortalUri)
  {
    Path = "sharing/rest/search"
  };
  string layers = "(type:\"Map Service\" OR type:\"Image Service\" OR type:\"Feature Service\" OR type:\"WMS\" OR type:\"KML\")";
  //any public layer content
  searchURL.Query = string.Format("q={0}&f=json", layers);

  EsriHttpClient httpClient = new EsriHttpClient();

  var searchResponse = httpClient.Get(searchURL.Uri.ToString());
  dynamic resultItems = JObject.Parse(await searchResponse.Content.ReadAsStringAsync());

  long numberOfTotalItems = resultItems.total.Value;
  if (numberOfTotalItems == 0)
    return;

  List<dynamic> resultItemList = new List<dynamic>();
  resultItemList.AddRange(resultItems.results);
  //get the first result
  dynamic item = resultItemList[0];

  string itemID = item.id;
  Item currentItem = ItemFactory.Instance.Create(itemID, ItemFactory.ItemType.PortalItem);

  await QueuedTask.Run(() =>
  {
    //Create a LayerCreationParam
    var layerParam = new LayerCreationParams(currentItem);
    // if we have an item that can be turned into a layer
    // add it to the map
    if (LayerFactory.Instance.CanCreateLayerFrom(currentItem))
      LayerFactory.Instance.CreateLayer<FeatureLayer>(layerParam, MapView.Active.Map);
  });
Clone this wiki locally