You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 01:10:17