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

调用ExchangeService的GetRoomLists时出现400 Bad Request错误求助

问题:调用ExchangeService.GetRoomLists时返回400 Bad Request错误

背景

C#应用调用ExchangeService实例的GetRoomLists方法时,抛出错误:The request failed. The remote server returned an error: (400) Bad Request.,需求为获取企业Exchange Server中特定用户关联的会议室列表。

问题代码片段

var cca = ConfidentialClientApplicationBuilder
                    .Create("*******")
                    .WithClientSecret("*******")
                    .WithTenantId("******")
                    .Build();

var ewsScopes2 = new string[] { "https://graph.microsoft.com/.default" };
         
var authResult2 = cca.AcquireTokenForClient(ewsScopes2).ExecuteAsync().Result;

// Configure the ExchangeService with the access token
var _service = new ExchangeService();
_service.Url = new Uri("https://graph.microsoft.com/v1.0/me/calendar/events");

_service.Credentials = new OAuthCredentials(authResult2.AccessToken);

_service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, "abc@mycompany.onmicrosoft.com");
// 此处存在多余的闭合括号,需移除
                   
EmailAddressCollection roomList = _service.GetRoomLists();

问题排查与修复方案

1. ExchangeService的Url配置错误

你将EWS服务的Url设置为Microsoft Graph的API地址,这是完全错误的。EWS需要指向Exchange专属的EWS端点:

  • Office 365环境下正确地址:
    _service.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");
    
  • 本地Exchange服务器需替换为对应服务器的EWS地址,比如https://你的Exchange服务器地址/EWS/Exchange.asmx。

2. 权限与作用域不匹配

  • 你使用客户端凭据流(AcquireTokenForClient),但Azure AD中配置的是委派权限,客户端凭据流要求配置应用权限。
  • 作用域需使用EWS专属作用域,而非Graph的:
    var ewsScopes2 = new string[] { "https://outlook.office365.com/.default" };
    
  • 在Azure AD中,需给应用添加EWS.AccessAsApp应用权限(属于Exchange Online权限),而非Graph的Calendars.Room权限,添加后需完成管理员同意。

3. 代码语法错误

代码中存在多余的闭合括号},需移除,否则会导致逻辑或运行时错误。

修复后的示例代码

var cca = ConfidentialClientApplicationBuilder
                    .Create("你的客户端ID")
                    .WithClientSecret("你的客户端密钥")
                    .WithTenantId("你的租户ID")
                    .Build();

// 使用EWS专属作用域
var ewsScopes = new string[] { "https://outlook.office365.com/.default" };
// 建议改用await避免同步阻塞死锁
var authResult = await cca.AcquireTokenForClient(ewsScopes).ExecuteAsync();

var _service = new ExchangeService();
// 设置正确的EWS端点
_service.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");
_service.Credentials = new OAuthCredentials(authResult.AccessToken);
// 配置模拟用户
_service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, "abc@mycompany.onmicrosoft.com");

EmailAddressCollection roomList = _service.GetRoomLists();

额外注意事项

  • 确保应用已完成EWS.AccessAsApp权限的管理员同意流程。
  • 本地Exchange服务器需确认已配置OAuth认证,且应用权限已同步至Exchange。
  • 尽量避免使用.Result同步阻塞异步方法,改用await提升代码稳定性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:02:53