SharePoint可视化Web部件中EWS调用Autodiscover服务失败问题排查
问题回顾
你现在遇到的情况是:用Exchange Web Services(EWS)在SharePoint可视化Web部件里创建Outlook会议邀请,控制台测试一切正常,但放到Web部件里就抛出无法定位Autodiscover服务的异常。相关代码和异常信息如下:
你的代码片段
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013); service.UseDefaultCredentials = true; service.AutodiscoverUrl("firstName.Lastname@xxxxxxxx.com", RedirectionUrlValidationCallback);
抛出的异常
Microsoft.Exchange.WebServices.Data.AutodiscoverLocalException: 无法定位Autodiscover服务。
at Microsoft.Exchange.WebServices.Autodiscover.AutodiscoverService.InternalGetLegacyUserSettings[TSettings](String emailAddress, List1 redirectionEmailAddresses, Int32& currentHop) at Microsoft.Exchange.WebServices.Autodiscover.AutodiscoverService.GetLegacyUserSettings[TSettings](String emailAddress) at Microsoft.Exchange.WebServices.Autodiscover.AutodiscoverService.InternalGetLegacyUserSettings(String emailAddress, List1 requestedSettings)
at Microsoft.Exchange.WebServices.Autodiscover.AutodiscoverService.GetUserSettings(String userSmtpAddress, UserSettingName[] userSettingNames)
at Microsoft.Exchange.WebServices.Data.ExchangeService.GetAutodiscoverUrl(String emailAddress, ExchangeVersion requestedServerVersion, AutodiscoverRedirectionUrlValidationCallback validateRedirectionUrlCallback)
at Microsoft.Exchange.WebServices.Data.ExchangeService.AutodiscoverUrl(String emailAddress, AutodiscoverRedirectionUrlValidationCallback validateRedirectionUrlCallback)
问题原因&解决方案
1. SharePoint应用程序池账户的权限/身份问题
控制台程序是用你当前登录的用户身份运行的,但SharePoint的Web部件是在应用程序池账户的上下文下执行的。这个账户可能没有访问Exchange Autodiscover服务的权限,或者无法通过AD查询Exchange的配置信息。
解决步骤:
- 确认SharePoint应用程序池账户是否被允许访问Exchange Autodiscover服务,必要时给它添加对应权限(比如Exchange的只读管理员权限,或者针对目标邮箱的访问权限,具体根据你的Exchange版本调整)
- 如果使用Kerberos认证,检查SPN配置是否正确,避免双重-hop问题——毕竟从SharePoint到Exchange需要传递用户身份,配置错误会导致身份无法正常传递
2. Autodiscover服务的网络访问限制
SharePoint服务器的应用程序池账户可能无法访问Autodiscover的URL(比如https://autodiscover.yourdomain.com/autodiscover/autodiscover.xml),可能是防火墙拦截、代理设置错误,或者DNS解析异常导致的。
排查&解决方法:
- 用应用程序池账户的身份登录SharePoint服务器,手动访问Autodiscover的URL,检查是否能获取到正常的XML响应
- 检查服务器的代理设置,确保应用程序池账户的上下文能访问Autodiscover的地址(无论内部还是外部)
- 确认DNS服务器能正确将
autodiscover.yourdomain.com解析到Exchange服务器
3. 绕过Autodiscover,直接指定EWS服务URL
如果Autodiscover的问题难以排查,咱们可以直接跳过自动发现流程,手动指定EWS的服务地址。这种方式不需要依赖Autodiscover的自动定位,适合环境固定的场景。
修改后的代码示例:
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013); service.UseDefaultCredentials = true; // 替换成你的Exchange服务器的EWS实际地址 service.Url = new Uri("https://your-exchange-server/EWS/Exchange.asmx");
4. 检查RedirectionUrlValidationCallback的逻辑
有时候回调函数拒绝了合法的重定向URL,也会导致Autodiscover失败。你需要确保回调函数正确处理重定向请求,比如允许同域的HTTPS重定向:
示例回调函数:
private static bool RedirectionUrlValidationCallback(string redirectionUrl) { // 可根据需求限制域名范围,比如只允许公司内部域的重定向 return redirectionUrl.StartsWith("https://", StringComparison.OrdinalIgnoreCase); }
如果回调函数返回false,Autodiscover流程会直接终止,自然无法定位到服务。
总结
优先排查SharePoint应用程序池的身份权限和网络访问能力,若问题仍存在,直接指定EWS URL是快速解决的方案,同时别忘了检查回调函数的逻辑是否合理。
内容的提问来源于stack exchange,提问作者Yayati

