c# - 我们需要检查 Exchange 上的哪些设置以避免抛出 ServiceRequestException?

标签 c# exchangewebservices exchange-server-2010 ews-managed-api

我们以编程方式(使用 Microsoft Exchange Web 服务托管 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);

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

我们已请求在客户端 Exchange 实例的 Exchange 命令行管理程序上执行以下命令:

Test-OutlookWebServices –Identity username
Get-OrganizationConfig

我们还没有收到结果。如果还有其他需要检查的内容,请告诉我们。

最佳答案

我们知道客户端有一个代理地址。我们不知道的是,我们在使用 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 行的那个。 :)

感谢所有查看问题并尝试回答问题的人。我希望有一天这会对某人有所帮助。

关于c# - 我们需要检查 Exchange 上的哪些设置以避免抛出 ServiceRequestException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14417516/

相关文章:

c# - 为什么我在编码网站上看到的大多数 DataContract 的 DataMembers 不是使用自动属性编写的?

c# - 使用 DI 将参数传递给 DbContext

c# - 从 EWS 导出可在 MS Outlook 中打开的电子邮件消息

c# - EWS 托管 API : Reply to a message while adding an internet header

C# 到 php 到 mysql

exchangewebservices - 检索当前用户的 UserId 对象

exchange-server - DistinguishedFolderId 'calendar' 的 GetUserConfiguration 的可用 UserConfigurationName 名称?

java - 无法使用 API Java SSL 和证书调用 EWS 服务

java - NTLM 身份验证方案选择错误

c# - WPF : Close combobox on item selection and display Message box