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

ASP.NET Framework 4.7.2 WebForm调用Microsoft Graph无响应求助

问题:ASP.NET Framework 4.7.2 WebForm项目中Microsoft Graph代码无反应

需要为ASP.NET Framework 4.7.2的WebForm老项目添加Microsoft Graph支持,以下代码在ASP.NET Core项目中可正常运行,但在WebForm项目中几乎相同的代码无任何反应且不报错。

ASP.NET Core 可运行代码

using Azure.Identity;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Graph;
using Microsoft.Graph.Models;

namespace WebApplication_testGraph.Pages
{
    public class IndexModel : PageModel
    {
        private readonly ILogger<IndexModel> _logger;
   
        public IndexModel(ILogger<IndexModel> logger)
        {
            _logger = logger;
        }

        public void OnGet()
        {
            var scopes = new[] { "https://graph.microsoft.com/.default" };
            var tenantId = "xxx";
            var clientId = "xxx";
            var clientSecret = "xxx";

            var options = new TokenCredentialOptions
            {
                AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
            };

            var clientSecretCredential = new ClientSecretCredential(
                tenantId, clientId, clientSecret, options);

            var accessToken = clientSecretCredential.GetTokenAsync(new Azure.Core.TokenRequestContext(scopes) { });

            var graphClient = new GraphServiceClient(clientSecretCredential, scopes);

            var requestBody = new Microsoft.Graph.Users.Item.SendMail.SendMailPostRequestBody
            {
                Message = new Message
                {
                    Subject = "Meet for lunch?",
                    Body = new ItemBody
                    {
                        ContentType = BodyType.Text,
                        Content = "The new cafeteria is open.",
                    },
                    ToRecipients = new List<Recipient>
                    {
                        new Recipient
                        {
                            EmailAddress = new EmailAddress
                            {
                                Address = "xxx@xxx.com",
                            },
                        },
                    },
                },
                SaveToSentItems = false,
            };

            graphClient.Users["xxx@yyy.com"].SendMail.PostAsync(requestBody);
        }
    }
}

ASP.NET Framework 4.7.2 WebForm 无反应代码

using Azure.Identity;
using Microsoft.Graph;
using Microsoft.Graph.Me.SendMail;
using Microsoft.Graph.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

public partial class test_email : System.Web.UI.Page
{
    protected async Task Page_LoadAsync(object sender, EventArgs e)
    {
        var scopes = new[] { "https://graph.microsoft.com/.default" };
        var tenantId = "xxx";
        var clientId = "xxxx";
        var clientSecret = "xxxx";

        var options = new TokenCredentialOptions
        {
            AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
        };

        var clientSecretCredential = new ClientSecretCredential(
            tenantId, clientId, clientSecret, options);

        var accessToken = await clientSecretCredential.GetTokenAsync(new Azure.Core.TokenRequestContext(scopes) { });

        var graphClient = new GraphServiceClient(clientSecretCredential, scopes);

        var requestBody = new Microsoft.Graph.Users.Item.SendMail.SendMailPostRequestBody
        {
            Message = new Message
            {
                Subject = "Meet for lunch?",
                Body = new ItemBody
                {
                    ContentType = BodyType.Text,
                    Content = "The new cafeteria is open.",
                },
                ToRecipients = new List<Recipient>
                {
                    new Recipient
                    {
                        EmailAddress = new EmailAddress
                        {
                            Address = "xxxxi@xxx.com",
                        },
                    },
                },
            },
            SaveToSentItems = false,
        };

        await graphClient.Users["xx@yyy.com"].SendMail.PostAsync(requestBody);
    }
}

原因分析及修复建议

1. WebForms异步事件处理机制问题

WebForms默认不识别async Task Page_LoadAsync这种签名的方法,需要正确配置异步页面:

  • 在对应的.aspx页面顶部添加Async="true"指令:
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="test_email.aspx.cs" Inherits="test_email" Async="true" %>
    
  • 改用WebForms标准的异步事件处理方式,比如使用RegisterAsyncTask:
    protected void Page_Load(object sender, EventArgs e)
    {
        // 注册异步任务
        RegisterAsyncTask(new PageAsyncTask(ExecuteGraphRequest));
    }
    
    private async Task ExecuteGraphRequest()
    {
        // 原来的Microsoft Graph代码逻辑
    }
    
    或者将方法改为async void Page_Load(WebForms中异步事件的兼容写法):
    protected async void Page_Load(object sender, EventArgs e)
    {
        // 原来的Microsoft Graph代码逻辑
    }
    

2. 异常被静默吞掉

异步代码中如果发生异常,可能因为没有正确的上下文捕获而被吞掉,添加try-catch块排查具体错误:

private async Task ExecuteGraphRequest()
{
    try
    {
        // 原来的Graph代码
    }
    catch (Exception ex)
    {
        // 将错误输出到页面或日志
        Response.Write($"错误信息:{ex.Message}<br/>堆栈跟踪:{ex.StackTrace}");
    }
}

3. 依赖库兼容性验证

确认安装的Microsoft.Graph和Azure.Identity NuGet包版本支持.NET Framework 4.7.2,部分新版本库可能仅支持.NET Core/.NET 5+,建议安装兼容的稳定版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 01:21:02