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

在Global.aspx中调用MS Graph发送邮件失败,寻求技术帮助

解决方案

核心问题是async void方法在ASP.NET传统应用的Application_Error事件中无法正确完成异步操作,加上未捕获的异常导致问题无日志可查,按以下步骤修复:

1. 重构邮件发送方法为async Task

将SendAsAsync从async void改为async Task,确保异步操作能被正确等待:

public async Task SendAsAsync(string content)
{
    try
    {
        // ... 其他初始化逻辑
        await graphClient.Users["xxxxxxxxxxxxxxxx"].SendMail.PostAsync(content);
    }
    catch (Exception ex)
    {
        // 将异常写入事件查看器,方便排查问题
        System.Diagnostics.EventLog.WriteEntry("Application", $"邮件发送失败: {ex.ToString()}", System.Diagnostics.EventLogEntryType.Error);
        throw; // 可选:保留异常让上层处理
    }
}

2. 修改Application_Error为异步事件处理方法

Application_Error作为事件处理程序必须用async void,但内部要await邮件发送方法,保证异步操作执行完成:

protected async void Application_Error(Object sender, EventArgs e)
{
    // .... 错误信息收集逻辑
    try
    {
        await SendAsAsync("Error Message");
    }
    catch (Exception ex)
    {
        // 记录调用邮件方法时的异常
        System.Diagnostics.EventLog.WriteEntry("Application", $"调用邮件发送方法失败: {ex.ToString()}", System.Diagnostics.EventLogEntryType.Error);
    }
    // .... 其他错误处理逻辑
}

关键说明

  • 原async void的SendAsAsync被调用后,ASP.NET请求上下文会直接继续执行后续代码并结束,不会等待Graph的异步请求完成,导致邮件发送被中断。
  • 新增的try-catch块可以捕获Graph调用中的具体错误(比如权限不足、API调用限制等),写入事件查看器后就能定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 08:27:41