Graph API运行时获取SharePoint子项报错,VS调试时正常
问题分析与解决方案
问题场景
使用.NET 8.0 + Microsoft Graph SDK 5.41.0同步SharePoint驱动器文件夹,获取根目录子项的代码如下:
DriveItem rootFolder = graphClient.Drives[_localSettings.driveId].Root.GetAsync((requestConfiguration) => { requestConfiguration.QueryParameters.Expand = new string[] { "children" }; }).Result;
VS调试时运行正常,但编译发布后执行抛出异常:发生一个或多个错误。'Property Get method was not found.'
核心原因
该问题本质是发布时的代码修剪(Trim)优化移除了DriveItem类中未被显式引用的属性get方法。Graph SDK依赖反射来反序列化API返回的JSON数据,而代码修剪会自动删除编译器判定为“未被使用”的成员,导致反射调用时找不到对应get方法。调试模式下默认不启用代码修剪,因此不会触发该异常。
解决方案
1. 禁用代码修剪(最简单直接)
在项目的.csproj文件中添加或修改以下配置,彻底关闭发布时的代码修剪:
<PropertyGroup> <PublishTrimmed>false</PublishTrimmed> <!-- 若使用Native AOT,需额外添加: --> <PublishAot>false</PublishAot> </PropertyGroup>
2. 使用强类型Expand避免修剪
Graph SDK 5.x提供了强类型的Expand选项,通过引用DriveItem的静态属性,让编译器识别到该属性被使用,从而避免被修剪:
using Microsoft.Graph.Models; // 改用强类型的Expand参数 DriveItem rootFolder = await graphClient.Drives[_localSettings.driveId].Root.GetAsync((requestConfiguration) => { requestConfiguration.QueryParameters.Expand = new[] { DriveItem.Children }; });
同时建议将.Result改为await,避免异步操作的死锁风险。
3. 保留Graph SDK的反射相关成员
若必须启用代码修剪,可通过配置保留Microsoft.Graph程序集的所有成员,在.csproj中添加:
<ItemGroup> <TrimmerRootAssembly Include="Microsoft.Graph" /> <TrimmerRootAssembly Include="Microsoft.Graph.Core" /> </ItemGroup>
或者使用[DynamicDependency]特性,显式声明需要保留的属性:
using System.Diagnostics.CodeAnalysis; [DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties, typeof(DriveItem))] public class YourSyncClass { // 你的同步逻辑代码 }
内容的提问来源于stack exchange,提问作者Michele Baronchelli
相关产品推荐
相关产品推荐

