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

Yoh*_*mon 3 c# exchangewebservices ews-managed-api exchange-server-2010

我们以编程方式(使用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)
Run Code Online (Sandbox Code Playgroud)

所以现在我们明确指定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)
Run Code Online (Sandbox Code Playgroud)

在以下代码的第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);
Run Code Online (Sandbox Code Playgroud)

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

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

Test-OutlookWebServices –Identity username
Get-OrganizationConfig
Run Code Online (Sandbox Code Playgroud)

我们还没有收到结果.如果还有其他问题需要检查,请告诉我们.

Yoh*_*mon 7

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

所以上面的代码应该是:

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"));
Run Code Online (Sandbox Code Playgroud)

我们使用的是域名地址或代理地址.我们从未尝试过上述组合,直到我们意外忘记更改上述代码第3行的那个.:)

感谢所有观看此问题的人,并试图回答这个问题.我希望有一天这会有所帮助.