C#中EWS报错:EwsLegacyId格式不被当前Exchange版本支持
解决EWS LegacyId不兼容的问题
这个错误我碰到过,核心原因就是你当前指定的EWS版本(Exchange2013_SP1)不再支持旧的EwsLegacyId格式,必须转换成EwsId才能正常使用。
关于Exchange版本的疑问
你提到的Exchange服务器版本15,对应的就是Exchange 2013/2013 SP1(Exchange 2013的版本号前缀就是15.x),所以你选ExchangeVersion.Exchange2013_SP1是完全正确的,版本选择不是问题根源,问题出在你使用的ID格式上——EwsLegacyId是Exchange 2010及更早版本的ID格式,2013及以后的EWS要求使用EwsId。
批量转换ID的简洁方法
没必要逐个转换,EWS支持批量ConvertId请求,一次处理大量ID,效率高很多。给你一个C#的示例代码:
// 初始化已配置好的ExchangeService实例 ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013_SP1); service.Credentials = new WebCredentials("username", "password"); service.Url = new Uri("https://your-exchange-server/EWS/Exchange.asmx"); // 准备需要转换的LegacyId列表 List<string> legacyIds = new List<string> { "legacyId1", "legacyId2", "...", "legacyIdN" }; // 构造批量转换请求 ConvertIdRequest convertRequest = new ConvertIdRequest(service); foreach (string legacyId in legacyIds) { convertRequest.AddSourceId(legacyId, IdFormat.EwsLegacyId); } convertRequest.TargetFormat = IdFormat.EwsId; // 执行请求并获取结果 ConvertIdResponse convertResponse = convertRequest.Execute(); // 处理转换后的ID foreach (ConvertIdResponse.ResponseMessage responseMsg in convertResponse.ResponseMessages) { if (responseMsg.Result == ServiceResult.Success) { string convertedEwsId = responseMsg.ConvertedId.UniqueId; // 存入列表或直接使用转换后的ID } else { // 处理转换失败的情况 Console.WriteLine($"转换失败:{responseMsg.MessageText}"); } }
注意事项
- EWS的批量ConvertId请求有数量限制,一般一次最多处理1000个ID,如果你的ID数量超过这个数,记得分批次处理。
- 如果你的ID是从旧系统或旧EWS版本(比如Exchange2010)获取的,一定要确认是
EwsLegacyId格式,避免转错格式。
内容的提问来源于stack exchange,提问作者Mika
相关产品推荐
相关产品推荐

