Removed default User-Agent header.

Using a library's default User-Agent violates OpenStreetMap's tile usage policy: https://operations.osmfoundation.org/policies/tiles/
This commit is contained in:
ClemensFischer 2026-01-21 22:33:05 +01:00
parent 8124d5714a
commit 66a51906ef
10 changed files with 67 additions and 30 deletions

View file

@ -23,19 +23,15 @@ namespace MapControl
/// <summary>
/// The System.Net.Http.HttpClient instance used to download images.
/// An application should add a unique User-Agent value to the DefaultRequestHeaders of this
/// HttpClient instance (or the Headers of a HttpRequestMessage used in a HttpMessageHandler).
/// Failing to set a unique User-Agent value is a violation of OpenStreetMap's tile usage policy
/// (see https://operations.osmfoundation.org/policies/tiles/) and results in blocked access
/// to their tile servers.
/// </summary>
public static HttpClient HttpClient
{
get
{
if (field == null)
{
field = new HttpClient { Timeout = TimeSpan.FromSeconds(10) };
field.DefaultRequestHeaders.Add("User-Agent", $"XAML-Map-Control/{typeof(ImageLoader).Assembly.GetName().Version}");
}
return field;
}
get => field ??= new HttpClient { Timeout = TimeSpan.FromSeconds(10) };
set;
}

View file

@ -154,7 +154,7 @@
</tools:MapLayerMenuItem>
<tools:MapLayerMenuItem Text="OpenStreetMap WMS">
<map:WmsImageLayer
ServiceUri="http://ows.terrestris.de/osm/service"
ServiceUri="https://ows.terrestris.de/osm/service"
Description="© [terrestris GmbH &amp; Co. KG](http://ows.terrestris.de/) © [OpenStreetMap contributors](http://www.openstreetmap.org/copyright)"/>
</tools:MapLayerMenuItem>

View file

@ -13,12 +13,14 @@ namespace SampleApplication
{
public MainWindow()
{
ImageLoader.HttpClient.DefaultRequestHeaders.Add("User-Agent", "XAML Map Control Avalonia Sample Application");
var loggerFactory = LoggerFactory.Create(builder => builder.AddDebug().SetMinimumLevel(LogLevel.Information));
ImageLoader.LoggerFactory = loggerFactory;
//var tileCache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder, loggerFactory);
//TileImageLoader.Cache = tileCache;
//Closed += (s, e) => tileCache.Dispose();
var tileCache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder, loggerFactory);
TileImageLoader.Cache = tileCache;
Closed += (s, e) => tileCache.Dispose();
InitializeComponent();
AddTestLayers();
@ -95,7 +97,7 @@ namespace SampleApplication
if (start != null)
{
measurementLine.Locations = LocationCollection.OrthodromeLocations(start, location);
measurementLine.Locations = LocationCollection.GeodesicLocations(start, location);
mouseLocation.Text += GetDistanceText(location.GetDistance(start));
}
}

View file

@ -210,7 +210,7 @@
</tools:MapLayerMenuItem>
<tools:MapLayerMenuItem Text="OpenStreetMap WMS">
<map:WmsImageLayer
ServiceUri="http://ows.terrestris.de/osm/service"
ServiceUri="https://ows.terrestris.de/osm/service"
Description="© [terrestris GmbH &amp; Co. KG](http://ows.terrestris.de/) © [OpenStreetMap contributors](http://www.openstreetmap.org/copyright)"/>
</tools:MapLayerMenuItem>

View file

@ -16,12 +16,14 @@ namespace SampleApplication
{
public MainPage()
{
ImageLoader.HttpClient.DefaultRequestHeaders.Add("User-Agent", "XAML Map Control UWP Sample Application");
var loggerFactory = LoggerFactory.Create(builder => builder.AddDebug().SetMinimumLevel(LogLevel.Information));
ImageLoader.LoggerFactory = loggerFactory;
//var tileCache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder, loggerFactory);
//TileImageLoader.Cache = tileCache;
//Unloaded += (s, e) => tileCache.Dispose();
var tileCache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder, loggerFactory);
TileImageLoader.Cache = tileCache;
Unloaded += (s, e) => tileCache.Dispose();
InitializeComponent();
AddTestLayers();
@ -93,7 +95,7 @@ namespace SampleApplication
if (start != null)
{
measurementLine.Locations = LocationCollection.OrthodromeLocations(start, location);
measurementLine.Locations = LocationCollection.GeodesicLocations(start, location);
mouseLocation.Text += GetDistanceText(location.GetDistance(start));
}
}

View file

@ -235,7 +235,7 @@
</tools:MapLayerMenuItem>
<tools:MapLayerMenuItem Text="OpenStreetMap WMS">
<map:WmsImageLayer
ServiceUri="http://ows.terrestris.de/osm/service"
ServiceUri="https://ows.terrestris.de/osm/service"
Description="© [terrestris GmbH &amp; Co. KG](http://ows.terrestris.de/) © [OpenStreetMap contributors](http://www.openstreetmap.org/copyright)"/>
</tools:MapLayerMenuItem>

View file

@ -16,12 +16,14 @@ namespace SampleApplication
{
public MainWindow()
{
ImageLoader.HttpClient.DefaultRequestHeaders.Add("User-Agent", "XAML Map Control WinUI Sample Application");
var loggerFactory = LoggerFactory.Create(builder => builder.AddDebug().SetMinimumLevel(LogLevel.Information));
ImageLoader.LoggerFactory = loggerFactory;
//var tileCache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder, loggerFactory);
//TileImageLoader.Cache = tileCache;
//Closed += (s, e) => tileCache.Dispose();
var tileCache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder, loggerFactory);
TileImageLoader.Cache = tileCache;
Closed += (s, e) => tileCache.Dispose();
InitializeComponent();
AddTestLayers();
@ -94,7 +96,7 @@ namespace SampleApplication
if (start != null)
{
measurementLine.Locations = LocationCollection.OrthodromeLocations(start, location);
measurementLine.Locations = LocationCollection.GeodesicLocations(start, location);
mouseLocation.Text += GetDistanceText(location.GetDistance(start));
}
}

View file

@ -212,7 +212,7 @@
</tools:MapLayerMenuItem>
<tools:MapLayerMenuItem Text="OpenStreetMap WMS">
<map:WmsImageLayer
ServiceUri="http://ows.terrestris.de/osm/service"
ServiceUri="https://ows.terrestris.de/osm/service"
Description="© [terrestris GmbH &amp; Co. KG](http://ows.terrestris.de/) © [OpenStreetMap contributors](http://www.openstreetmap.org/copyright)"/>
</tools:MapLayerMenuItem>

View file

@ -10,16 +10,43 @@ using System.Windows.Input;
namespace SampleApplication
{
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
class HttpHandler : DelegatingHandler
{
public HttpHandler()
#if NET
: base(new SocketsHttpHandler())
#else
: base(new HttpClientHandler())
#endif
{
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
Debug.WriteLine(request.RequestUri);
return base.SendAsync(request, cancellationToken);
}
}
public partial class MainWindow : Window
{
public MainWindow()
{
var httpClient = new HttpClient(new HttpHandler()) { Timeout = TimeSpan.FromSeconds(10) };
httpClient.DefaultRequestHeaders.Add("User-Agent", "XAML Map Control Avalonia Sample Application");
ImageLoader.HttpClient = httpClient;
var loggerFactory = LoggerFactory.Create(builder => builder.AddDebug().SetMinimumLevel(LogLevel.Information));
ImageLoader.LoggerFactory = loggerFactory;
//var tileCache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder, loggerFactory);
//TileImageLoader.Cache = tileCache;
//Closed += (s, e) => tileCache.Dispose();
var tileCache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder, loggerFactory);
TileImageLoader.Cache = tileCache;
Closed += (s, e) => tileCache.Dispose();
InitializeComponent();
AddTestLayers();
@ -43,6 +70,10 @@ namespace SampleApplication
{
map.TargetCenter = map.ViewToLocation(e.GetPosition(map));
}
else if (Keyboard.Modifiers.HasFlag(ModifierKeys.Shift))
{
map.ProjectionCenter = map.ViewToLocation(e.GetPosition(map));
}
else if (Keyboard.Modifiers.HasFlag(ModifierKeys.Control) &&
map.MapLayer is WmsImageLayer wmsLayer)
{
@ -83,7 +114,7 @@ namespace SampleApplication
if (start != null)
{
measurementLine.Locations = LocationCollection.OrthodromeLocations(start, location);
measurementLine.Locations = LocationCollection.GeodesicLocations(start, location);
mouseLocation.Text += GetDistanceText(location.GetDistance(start));
}
}

View file

@ -25,6 +25,10 @@
<ProjectReference Include="..\..\MapUiTools\WPF\MapUiTools.WPF.csproj" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)'=='net48'">
<Reference Include="System.Net.Http" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="10.0.2" />
</ItemGroup>