调用ProvisioningDeviceClient.RegisterAsync时异常及应用崩溃问题
DPS设备注册异常排查
问题概述
使用Azure DPS设备注册客户端时,先后遇到两个版本的异常:
- 版本1.5.2:抛出方法未找到异常
- 版本1.19.2:方法未找到异常消失,但应用直接崩溃且异常未被捕获
注册设备方法实现
public async Task<DeviceRegistrationResult> RegisterDevice(ProvisioningDeviceClient provClient) { DeviceRegistrationResult registrationResult = null; try { registrationResult = await provClient.RegisterAsync().ConfigureAwait(false); if (registrationResult.Status != ProvisioningRegistrationStatusType.Assigned) { } } catch (Exception ex) { } return registrationResult; }
方法调用代码
var deviceRegistrationResult = await _dpsDeviceClient.RegisterDevice(provClient);
版本1.5.2的异常信息
System.MissingMethodException: 'Method not found: 'System.Threading.Tasks.Task`1<Microsoft.Azure.Devices.Provisioning.Client.DeviceRegistrationResult> Microsoft.Azure.Devices.Provisioning.Client.ProvisioningDeviceClient.RegisterAsync()'.'
版本1.19.2的异常表现
升级到1.19.2后,上述方法未找到的异常消失,但应用直接崩溃,且RegisterDevice方法中的catch(Exception ex)块未捕获到任何异常。
ProvisioningDeviceClient创建代码
using (var transport = new ProvisioningTransportHandlerMqtt(TransportFallbackType.WebSocketOnly)) { provClient = ProvisioningDeviceClient.Create(GlobalDeviceEndpoint, "MyIdScope", security, transport); }
注:出于安全考虑,未提供真实的MyIdScope。
项目文件(.csproj)内容
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Azure.Devices.Provisioning.Client" Version="1.19.2" /> <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.1" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.1" /> <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.1" /> <PackageReference Include="Serilog.Extensions.Logging" Version="3.0.1" /> <PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" /> <PackageReference Include="Serilog.Sinks.File" Version="4.1.0" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\ConnectivityLibrary\ConnectivityLibrary.csproj" /> </ItemGroup> <ItemGroup> <None Update="appsettings.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> </ItemGroup> </Project>
额外发现的内部异常
调试时观察到provClient对象存在如下内部异常:
'((Microsoft.Azure.Devices.Shared.DefaultWebProxySettings)provClient._transport.Proxy).Credentials' threw an exception of type 'System.NotSupportedException'
排查与解决建议
- 补全异常捕获日志:先在
RegisterDevice的catch块中添加日志输出(当前为空),确认是否真的没有捕获到异常,或者异常来自异步上下文之外。 - 检查上层调用逻辑:确认调用
RegisterDevice的代码是否存在同步阻塞异步方法的情况(比如使用.Wait()/.Result),这种场景会导致未观察到的任务异常,引发应用崩溃。 - 处理代理异常:针对
DefaultWebProxySettings.Credentials的NotSupportedException,可以显式禁用代理或配置自定义代理:using (var transport = new ProvisioningTransportHandlerMqtt(TransportFallbackType.WebSocketOnly)) { transport.Proxy = null; // 禁用自动代理检测 provClient = ProvisioningDeviceClient.Create(GlobalDeviceEndpoint, "MyIdScope", security, transport); } - 排查依赖版本冲突:检查引用的
ConnectivityLibrary项目是否依赖了旧版本的Microsoft.Azure.Devices.Provisioning.Client,导致版本不一致。可以在主项目中添加强制版本配置:<PackageReference Include="Microsoft.Azure.Devices.Provisioning.Client" Version="1.19.2" PrivateAssets="all" />
内容的提问来源于stack exchange,提问作者kudlatiger
相关产品推荐
相关产品推荐

