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

Microsoft Graph订阅Post请求异常求助:无请求体导致失败

解决Microsoft Graph订阅请求无请求体的问题

针对你遇到的订阅请求因缺少请求体失败的问题,这里有几个可行的排查和解决方向:

1. 确认Microsoft Graph SDK版本

不同版本的Graph SDK在处理POST请求序列化时可能存在差异。如果使用的是较旧版本的Microsoft.Graph NuGet包,建议升级到最新稳定版,新版本修复了不少序列化相关的bug。

2. 显式指定请求序列化配置

尝试在调用PostAsync时,显式传入请求配置,确保订阅对象被正确序列化到请求体:

public async Task<Subscription> SubscribeToEmailNotificationsAsync(string userId, string notificationUrl)
{
    var subscription = new Subscription
    {
        ChangeType = "created",
        NotificationUrl = notificationUrl,
        Resource = $"users/{userId}/mailFolders('inbox')/messages",
        ExpirationDateTime = DateTimeOffset.UtcNow.AddDays(2),
        ClientState = Guid.NewGuid().ToString(),
        LatestSupportedTlsVersion = "v1_2",
    };

    // 显式配置请求选项,确保序列化正常
    var requestOptions = new RequestConfiguration
    {
        Headers = new Dictionary<string, string>
        {
            { "Content-Type", "application/json" }
        }
    };

    return await _client.Subscriptions.PostAsync(subscription, requestOptions);
}

3. 检查自定义序列化配置冲突

如果你的GraphServiceClient配置了自定义的JsonSerializerOptions,可能会和SDK默认的序列化规则冲突,导致请求体无法生成。确保配置的序列化选项兼容Graph API的要求,比如保留默认的驼峰命名、不忽略空值等:

// 错误示例:自定义配置可能导致序列化失败
var options = new JsonSerializerOptions
{
    PropertyNamingPolicy = null, // 不要禁用驼峰命名
    IgnoreNullValues = true // Graph API需要接收所有必填字段,即使为空(这里你的字段都有值,但全局配置可能影响)
};

// 正确做法:使用SDK默认配置,或仅修改必要项
var graphClient = new GraphServiceClient(authProvider);

4. 手动构建请求验证

如果以上方法无效,尝试手动构建RequestInformation发送请求,绕开SDK的自动序列化,验证请求体是否正确:

public async Task<Subscription> SubscribeToEmailNotificationsAsync(string userId, string notificationUrl)
{
    var subscription = new Subscription
    {
        ChangeType = "created",
        NotificationUrl = notificationUrl,
        Resource = $"users/{userId}/mailFolders('inbox')/messages",
        ExpirationDateTime = DateTimeOffset.UtcNow.AddDays(2),
        ClientState = Guid.NewGuid().ToString(),
        LatestSupportedTlsVersion = "v1_2",
    };

    // 手动构建请求信息
    var requestInfo = new RequestInformation
    {
        HttpMethod = Method.POST,
        Uri = new Uri("https://graph.microsoft.com/v1.0/subscriptions"),
        Content = JsonContent.Create(subscription)
    };

    // 添加授权头
    await _client.AuthenticationProvider.AuthenticateRequestAsync(requestInfo);

    // 发送请求并解析响应
    var response = await _client.RequestAdapter.SendAsync<Subscription>(requestInfo);
    return response;
}

5. 检查NotificationUrl的验证响应

另外,Graph API在创建订阅时会先发送验证请求到你的NotificationUrl,确保你的端点能正确返回验证代码(查询参数中的validationToken),同时确认代码中的NotificationUrl是否和Postman中完全一致,没有编码或格式问题。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 15:42:48