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
相关产品推荐
相关产品推荐

