Skip to content

ProSnippets Sharing

arcgisprosdk edited this page Jun 23, 2017 · 22 revisions
Language:              C#  
Subject:               Sharing  
Contributor:           ArcGIS Pro SDK Team <[email protected]>  
Organization:          esri, http://www.esri.com  
Date:                  6/23/2017  
ArcGIS Pro:            2.0  
Visual Studio:         2015, 2017  
.NET Target Framework: 4.6.1  

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 portal = ArcGISPortalManager.Current.GetPortal(new Uri(uri, UriKind.Absolute));
if (!portal.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
});

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}", userName),
  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: 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(() =>
    {
      // 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(currentItem, MapView.Active.Map);
    });
Clone this wiki locally