PAYATHON 2026

.NET SDK [5.8.0] 无法为 Teams API 设置 model=B

技术老齐

结论

在 Microsoft Graph .NET SDK 5.8.0 中,如果 GetAllMessagesRequestBuilderGetQueryParameters 没有生成 Model 属性,就不能通过常规的 rq.QueryParameters.Model 设置 model=B。

问题不在 Microsoft Graph 服务端,而在于这个版本的 SDK 请求模型没有公开该参数。可以先通过 RequestBuilder 生成 RequestInformation,再手动添加查询参数,最后使用 RequestAdapter 发送请求。与替换整个 URI 相比,直接修改 QueryParameters 更稳妥。

推荐解决方案

using Microsoft.Graph.Models.ODataErrors;
using Microsoft.Graph.Teams.Item.Channels.GetAllMessages;
using Microsoft.Kiota.Abstractions.Serialization;

var requestInfo = _graphClient
    .Teams[teamId]
    .Channels
    .GetAllMessages
    .ToGetRequestInformation(requestConfiguration =>
    {
        requestConfiguration.QueryParameters.Top = 200;
    });

// SDK 5.8.0 未生成 Model 属性,因此手动补充查询参数。
requestInfo.QueryParameters["model"] = "B";

var errorMapping = new Dictionary<string, ParsableFactory<IParsable>>
{
    { "4XX", ODataError.CreateFromDiscriminatorValue },
    { "5XX", ODataError.CreateFromDiscriminatorValue }
};

var response = await _graphClient.RequestAdapter.SendAsync(
    requestInfo,
    GetAllMessagesResponse.CreateFromDiscriminatorValue,
    errorMapping
);

最终请求应等价于:

GET https://graph.microsoft.com/v1.0/teams/{team-id}/channels/getAllMessages?model=B&%24top=200

这种写法保留了 RequestBuilder 生成的请求方法、URL 模板、路径参数和其他查询参数,只补上 SDK 没有公开的 model 参数。与手动拼接完整 URL 相比,它更不容易遇到路径格式或编码问题。

如果当前 Kiota 版本不允许直接修改查询参数

不同版本的 Microsoft.Kiota.Abstractions 在 API 细节上可能有所不同。如果当前版本不支持通过 requestInfo.QueryParameters["model"] 添加参数,可以改用手动 URI:

using Microsoft.Graph.Models.ODataErrors;
using Microsoft.Graph.Teams.Item.Channels.GetAllMessages;
using Microsoft.Kiota.Abstractions.Serialization;

var requestInfo = _graphClient
    .Teams[teamId]
    .Channels
    .GetAllMessages
    .ToGetRequestInformation();

requestInfo.URI = new Uri(
    $"https://graph.microsoft.com/v1.0/teams/{Uri.EscapeDataString(teamId)}/channels/getAllMessages?model=B&%24top=200"
);

var errorMapping = new Dictionary<string, ParsableFactory<IParsable>>
{
    { "4XX", ODataError.CreateFromDiscriminatorValue },
    { "5XX", ODataError.CreateFromDiscriminatorValue }
};

var response = await _graphClient.RequestAdapter.SendAsync(
    requestInfo,
    GetAllMessagesResponse.CreateFromDiscriminatorValue,
    errorMapping
);

这里应使用 REST 文档中的 getAllMessages 路径。除非当前 SDK 生成的请求明确要求,否则不要在路径中额外添加 getAllMessages() 的括号。

为什么需要绕过生成的 QueryParameters

Graph SDK 5.x 的 RequestBuilder 和 QueryParameters 类型由 Microsoft Graph 元数据和代码生成规则产生。只有出现在对应 QueryParameters 类中的字段,才能使用下面这种强类型写法:

requestConfiguration.QueryParameters.Model = "B";

如果类中没有 Model 属性,即使服务端支持 model=B,这段代码也无法通过编译。此时有三种处理方式:

  • 修改生成后的 RequestInformation;
  • 手动构造请求 URI;
  • 升级到已经正式公开该参数的 SDK 版本,但需要先确认目标版本确实包含该属性。

注意事项

  • model=B 涉及计费模式,仍须满足相应 API 的权限、许可和订阅要求。绕过 SDK 的强类型参数并不会绕过服务端检查。
  • URI 中的 $top 应正确编码为 %24top。通过 RequestBuilder 设置 Top 时,可以由 SDK 处理编码。
  • 不建议为了添加一个参数而重新创建 HttpClient 并自行获取令牌。继续使用现有的 RequestAdapter,可以保留 SDK 已配置的认证和中间件行为。
  • 手动调用 RequestAdapter.SendAsync 时,需要提供响应反序列化工厂和错误映射,否则错误响应可能无法正确解析为 ODataError。
  • 如果计划升级 Microsoft Graph SDK,应先检查目标版本生成的 GetAllMessages QueryParameters 是否包含 Model,不能因为版本较新就认定它已经支持该参数。

备注:内容仅供参考。