我们需要检查Exchange上的哪些设置来避免ServiceRequestException被抛出?

本文关键字:ServiceRequestException 设置 检查 Exchange 我们 | 更新日期: 2023-09-27 17:54:41

我们以编程方式(使用Microsoft Exchange Web Services Managed API 2.0)访问用户的日历(在Exchange 2010 SP1上)。

我们已经能够在我们的开发环境中通过自动发现成功地与EWS通信,我们不必在Exchange上进行任何特定的设置(我们使用默认的开箱即用设置)。

不幸的是,同样的方法在客户端环境中不起作用。客户端没有测试环境。我们应该与他们的实时Exchange服务器通信。

最初自动发现在客户端环境中不起作用。我们得到了以下错误:

Microsoft.Exchange.WebServices.Data.AutodiscoverLocalException: The Autodiscover service couldn't be located.
   at Microsoft.Exchange.WebServices.Autodiscover.AutodiscoverService.InternalGetLegacyUserSettings[TSettings](String emailAddress, List`1 redirectionEmailAddresses, Int32& currentHop)
   at Microsoft.Exchange.WebServices.Autodiscover.AutodiscoverService.GetLegacyUserSettings[TSettings](String emailAddress)
   at Microsoft.Exchange.WebServices.Autodiscover.AutodiscoverService.InternalGetLegacyUserSettings(String emailAddress, List`1 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)

现在我们显式地为EWS指定URL。这给了我们以下错误:

Microsoft.Exchange.WebServices.Data.ServiceRequestException: The request failed. The remote server returned an error: (401) Unauthorized. ---> System.Net.WebException: The remote server returned an error: (401) Unauthorized.
       at System.Net.HttpWebRequest.GetResponse()
       at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.GetEwsHttpWebResponse(HttpWebRequest request)
       --- End of inner exception stack trace ---
       at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.GetEwsHttpWebResponse(HttpWebRequest request)
       at Microsoft.Exchange.WebServices.Data.SimpleServiceRequestBase.InternalExecute()
       at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.Execute()
       at Microsoft.Exchange.WebServices.Data.ExchangeService.BindToFolder(FolderId folderId, PropertySet propertySet)
       at Microsoft.Exchange.WebServices.Data.ExchangeService.BindToFolder[TFolder](FolderId folderId, PropertySet propertySet)
       at Microsoft.Exchange.WebServices.Data.CalendarFolder.Bind(ExchangeService service, FolderId id)

在下面代码的第5行抛出异常:

ServicePointManager.ServerCertificateValidationCallback = this.CertificateValidationCallBack;
ExchangeService exchangeWebService = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
exchangeWebService.Credentials = new WebCredentials("username@domain.local", "myPassword");
exchangeWebService.AutodiscoverUrl("username@domain.local", this.RedirectionUrlValidationCallback);
**CalendarFolder calendarFolder = CalendarFolder.Bind(exchangeWebService, new FolderId(WellKnownFolderName.Calendar, userName));**
CalendarView calendarView = new CalendarView(startDate, endDate);
calendarView.PropertySet = new PropertySet(BasePropertySet.IdOnly, AppointmentSchema.Subject, AppointmentSchema.Start, AppointmentSchema.IsRecurring, AppointmentSchema.AppointmentType, AppointmentSchema.End, AppointmentSchema.Duration);
FindItemsResults<Appointment> findResults = calendarFolder.FindAppointments(calendarView);

我们不介意自动发现不工作,因为我们可以显式地将URL指定给EWS。我们想知道的是我们需要在Exchange的客户端实例上检查哪些设置、权限等,以确定为什么会抛出上述异常(ServiceRequestException)。

我们已经请求在Exchange的客户端实例的Exchange Management Shell上执行以下命令:

Test-OutlookWebServices –Identity username
Get-OrganizationConfig

我们还没有收到结果。

我们需要检查Exchange上的哪些设置来避免ServiceRequestException被抛出?

请告诉我们还有什么需要检查的。

我们知道客户端有一个代理地址。我们不知道的是,在使用EWS进行身份验证时需要使用域地址(username@domain.local),在调用AutodiscoverUrl和访问邮箱时需要使用代理地址(username@domain.com)。

所以上面的代码应该是:
ServicePointManager.ServerCertificateValidationCallback = this.CertificateValidationCallBack;
ExchangeService exchangeWebService = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
exchangeWebService.Credentials = new WebCredentials("username@domain.local", "myPassword");
exchangeWebService.AutodiscoverUrl("username@domain.com", this.RedirectionUrlValidationCallback);
CalendarFolder calendarFolder = CalendarFolder.Bind(exchangeWebService, new FolderId(WellKnownFolderName.Calendar, "username@domain.com"));

我们使用的不是域名地址就是代理地址。我们从来没有尝试过上面的组合,直到我们不小心忘记更改上面代码的第3行。:)

谢谢你,每个人看了这个问题,并试图回答它。

我将建议您启用跟踪,以实现以下操作:

 Service.TraceEnabled = true;

当我启用跟踪时,我也面临同样的问题,这些跟踪将指导您究竟发生了什么。在我的情况下,SSL证书问题是为了解决它,我遵循以下post

可以有很多问题,例如:

  • 用户可以被阻止

  • DSN无法找到autodiscover.domain.com

相关文章:
  • 没有找到相关文章