So, this is literally my first day writing a single line of C# and working with the .NET SDK. The Developer documentation has been really good thus far and I've been able to understand everything pretty well.
Unfortunately, when I got towards the end of the third tutorial, I ran into a problem - my corporate proxy.
Since this is my first day working with C#, I'm not sure how to build a function to use IWA to authenticate to our internal proxy.
Any help or guidance is greatly appreciated.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using Esri.ArcGISRuntime.Controls; using Esri.ArcGISRuntime.Portal; using Esri.ArcGISRuntime.WebMap; namespace FirstApp { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private ArcGISPortal arcGISOnline; private ArcGISPortalItem selectedPortalItem; // changes the basemap layer private void baseMap_SelectionChanged(object sender, SelectionChangedEventArgs e) { var combo = sender as ComboBox; var sel = combo.SelectedItem as ComboBoxItem; if (sel.Tag == null) { return; } //Find and remove the current basemap layer from the map if (mainMap == null) { return; } var oldBasemap = mainMap.Layers["BaseMap"]; mainMap.Layers.Remove(oldBasemap); //Create a new basemap layer var newBaseMap = new Esri.ArcGISRuntime.Layers.ArcGISTiledMapServiceLayer(); //Set the ServiceUri with the url defined for the ComboboxItem's Tag newBaseMap.ServiceUri = sel.Tag.ToString(); //Give the layer an ID so it an still be found with the code above newBaseMap.ID = "BaseMap"; //Insert the new basemap layer as the first (bottom) layer in the map mainMap.Layers.Insert(0, newBaseMap); } // searches the portal for content private async void SearchButton_Click(object sender, RoutedEventArgs e) { try { if (this.arcGISOnline == null) { // create the uri for the portal var portalUri = new Uri("https://gis.kdc.capitalone.com/portal/sharing/rest"); // create the portal this.arcGISOnline = await ArcGISPortal.CreateAsync(portalUri); } // create a variable to store search results IEnumerable<ArcGISPortalItem> results = null; if (this.ItemTypeCombobox.SelectedValue.ToString() == "BaseMap") { // basemap search returns web maps that contain the basemap layer var basemapSearch = await this.arcGISOnline.ArcGISPortalInfo.SearchBasemapGalleryAsync(); results = basemapSearch.Results; } else { // get the search term provided in the UI var searchTerm = this.SearchTextBox.Text.Trim(); var searchItem = this.ItemTypeCombobox.SelectedValue.ToString(); // build a query that searches for the specified type // ('web mapping application' is excluded from the search since 'web map' will match those item types too) var queryString = string.Format("\"{0}\" type:(\"{1}\" NOT \"web mapping application\")", searchTerm, searchItem); var searchParameters = new SearchParameters() { QueryString = queryString, SortField = "avgrating", SortOrder = QuerySortOrder.Descending, Limit = 10 }; // execute the search var itemSearch = await this.arcGISOnline.SearchItemsAsync(searchParameters); results = itemSearch.Results; } // show the results in the list box this.ResultListBox.ItemsSource = results; } catch (Exception ex) { MessageBox.Show(ex.Message, "Error searching Atlas"); } } // resets the UI controls to keep them in sync with the currently selected portal item in the ResultsListBox private void ResetUI() { // clear UI controls this.SnippetTextBlock.Text = ""; this.ThumbnailImage.Source = null; this.ShowMapButton.IsEnabled = false; } private void ResultSelectionChanged(object sender, SelectionChangedEventArgs e) { this.ResetUI(); // store the currently selected portal item this.selectedPortalItem = this.ResultListBox.SelectedItem as ArcGISPortalItem; if (this.selectedPortalItem == null) { return; } // show the portal item snippet (brief description) in the UI if (!string.IsNullOrEmpty(this.selectedPortalItem.Snippet)) { this.SnippetTextBlock.Text = this.selectedPortalItem.Snippet; } // show a thumnail for the selected portal item (if there is one) if (this.selectedPortalItem.ThumbnailUri != null) { var src = new BitmapImage(this.selectedPortalItem.ThumbnailUri); this.ThumbnailImage.Source = src; } // enable the show map button when a web map portal item is chosen this.ShowMapButton.IsEnabled = (this.selectedPortalItem.Type == ItemType.WebMap); } private async void ShowMapButton_Click(object sender, RoutedEventArgs e) { // create a web map from the selected portal item var webMap = await WebMap.FromPortalItemAsync(this.selectedPortalItem); // load the web map into a web map view model var webMapVM = await WebMapViewModel.LoadAsync(webMap, this.arcGISOnline); // show the web map view model's map in the page's map view control this.mainMapView.Map = webMapVM.Map; } } }
Solved! Go to Solution.
Got it!
If your internal proxy is blocking a request you are sending outside the domain and you're getting a 407 error - provided your internal proxy uses IWA, you can simply update your App.config XML to with the <system.net> tag and set the <defaultProxy useDefaultCredentials> property to True.
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <system.net> <defaultProxy useDefaultCredentials="True" /> </system.net> </configuration>
Got it!
If your internal proxy is blocking a request you are sending outside the domain and you're getting a 407 error - provided your internal proxy uses IWA, you can simply update your App.config XML to with the <system.net> tag and set the <defaultProxy useDefaultCredentials> property to True.
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <system.net> <defaultProxy useDefaultCredentials="True" /> </system.net> </configuration>
yeah this only works in .net framework and not in .net5