Blazor 通过 JavaScript 互操作(JS Interop)调用浏览器地理位置 API,需在 JS 中封装 navigator.geolocation.getCurrentPosition 并在 C# 中通过 IJSRuntime 调用,注意 HTTPS 安全上下文、用户授权及异常处理。
Blazor 可以调用浏览器 API(比如地理位置、通知、存储、摄像头等),但必须通过 JavaScript 互操作(JS Interop)来实现,因为这些 API 运行在浏览器上下文中,而 Blazor WebAssembly 或 Server 的 .NET 代码本身无法直接访问。
核心思路是:在 JS 中封装 navigator.geolocation.getCurrentPosition,再从 C# 调用它,并用 Promise + 回调或 async/await 处理结果。
wwwroot/index.html(WASM)或 Pages/_Host.cshtml(Server)的 或底部添加一段轻量 JS 函数:window.getGeoLocation = () => {
return new Promise((resolve, reject) => {
if (!navigator.geolocation) {
reject(new Error("Geolocation is not supported"));
return;
}
navigator.geolocation.getCurrentPosition(
pos => resolve({ lat: pos.coords.latitude, lng: pos.coords.longitude }),
err => reject(new Error(e
rr.message))
);
});
};.razor 文件)中注入 IJSRuntime,然后调用:@inject IJSRuntime JSRuntime@code { private string status = "点击获取位置..."; private async Task GetLocationAsync() { try { status = "定位中..."; var location = await JSRuntime.InvokeAsync
("getGeoLocation"); status = $"纬度:{location.Lat},经度:{location.Lng}"; } catch (Exception ex) { status = $"失败:{ex.Message}"; } } } // 定义匹配 JS 返回结构的类 public class LocationResult { public double Lat { get; set; } public double Lng { get; set; } }
现代浏览器要求地理位置 API 必须在安全上下文(https:// 或 localhost)中调用。HTTP 站点会静默拒绝请求。
dotnet watch 启动默认就是 https://localhost:5001,没问题如果需要持续跟踪(比如地图应用),可封装 navigator.geolocation.watchPosition,并配合 .NET 事件或回调委托传递更新:
startWatching 和 stopWatching 方法DotNetObjectReference.Create(this) 传入回调对象,JS 触发 positionCallback.invokeMethodAsync
clearWatch 避免内存泄漏和后台耗电社区有封装好的库简化流程,例如 Blazored.Geolocation:
dotnet add package Blazored.Geolocation
services.AddBlazoredGeolocation();
IGeolocationService,直接 await GetCurrentPositionAsync()
基本上就这些。关键不是“能不能”,而是“怎么安全、可靠、可维护地桥接”。写好 JS 封装 + 做好异常和权限兜底,就能稳稳用上浏览器能力。