在IIS部署的ASP.NET Core/.NET 8后端获取用户设备名的方法咨询
能不能在IIS部署的ASP.NET Core/.NET 8后端获取用户设备名称?
可以获取,但不能直接通过服务器端的系统API拿到——你之前得到IIS服务器名称,是因为误用了服务器端的环境/系统信息API(比如Environment.MachineName),这类API本来就返回宿主服务器的信息,和客户端用户设备无关。
用户的设备名称属于客户端浏览器环境的信息,必须由客户端先收集,再通过API请求传递给后端。具体实现步骤如下:
1. 客户端(Blazor)获取设备信息
Blazor本身无法直接访问浏览器的API,需要通过JavaScript互操作来获取。常见的两种方式:
方式一:解析用户代理字符串(兼容所有浏览器)
在Blazor项目的wwwroot下创建一个JS文件(比如deviceUtils.js),添加以下函数:
window.getDeviceInfo = function() { return navigator.userAgent; };
然后在Blazor组件中调用这个函数:
@inject IJSRuntime JSRuntime private async Task<string> GetUserDeviceInfo() { return await JSRuntime.InvokeAsync<string>("getDeviceInfo"); }
解析后的userAgent字符串会包含设备品牌、型号、浏览器等信息(比如Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1)。
方式二:使用Navigator User Agent Data(现代浏览器支持)
如果目标用户使用现代浏览器(Chrome 89+/Edge 89+等),可以用更结构化的API:
window.getDeviceInfo = async function() { if ('userAgentData' in navigator) { const data = await navigator.userAgentData.getHighEntropyValues(['platform', 'model', 'brand']); return JSON.stringify({ Brand: data.brand, Model: data.model, Platform: data.platform }); } else { // 降级到userAgent return JSON.stringify({ UserAgent: navigator.userAgent }); } };
2. 将设备信息传递给后端API
拿到设备信息后,在调用后端API时将其传递过去,常见的两种方式:
方式一:通过自定义HTTP请求头传递
@inject HttpClient Http private async Task CallApiWithDeviceInfo() { var deviceInfo = await GetUserDeviceInfo(); Http.DefaultRequestHeaders.Add("X-Device-Info", deviceInfo); var response = await Http.GetFromJsonAsync<YourResponseModel>("api/your-endpoint"); }
方式二:作为请求体/参数传递
如果需要更结构化的传递,可以把设备信息封装到请求模型中:
public class ApiRequest { public string DeviceInfo { get; set; } // 其他请求参数 } // 调用API时 var request = new ApiRequest { DeviceInfo = await GetUserDeviceInfo(), // 填充其他参数 }; var response = await Http.PostAsJsonAsync("api/your-endpoint", request);
3. 后端API接收设备信息
在后端的API控制器中,读取传递过来的设备信息:
从请求头读取
[ApiController] [Route("api/[controller]")] public class YourController : ControllerBase { [HttpGet] public IActionResult Get() { if (Request.Headers.TryGetValue("X-Device-Info", out var deviceInfo)) { // 处理设备信息 return Ok(new { DeviceInfo = deviceInfo.ToString() }); } return Ok(new { DeviceInfo = "未获取到设备信息" }); } }
从请求体读取
[HttpPost] public IActionResult Post([FromBody] ApiRequest request) { var deviceInfo = request.DeviceInfo; // 处理设备信息 return Ok(); }
注意事项
- 浏览器可能会限制某些高熵设备信息的获取,部分隐私保护严格的浏览器可能会返回模糊的设备数据。
- 不要依赖设备信息做核心业务逻辑(比如身份验证),因为这些信息可以被篡改。
内容的提问来源于stack exchange,提问作者Billy Robshaw
相关产品推荐
相关产品推荐

