3

プログラムで(Microsoft ExchangeWebサービスマネージAPI2.0を使用して)ユーザーのカレンダーにアクセスします(Exchange 2010 SP1の場合)。

Exchangeで特定の設定(デフォルトの初期設定を使用)を行う必要がなかった開発環境で、自動検出を介してEWSと正常に通信することができました。

残念ながら、同じことはクライアントの環境では機能しません。クライアントにはテスト環境がありません。私たちは彼らのライブ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を明示的に指定できるため、自動検出が機能しないことは問題ありません。知りたいのは、上記の例外(ServiceRequestException)がスローされる理由を判別するために、Exchangeのクライアントのインスタンスをチェックする必要がある設定やアクセス許可などです。

クライアントのExchangeインスタンスのExchange管理シェルで次のコマンドを実行するように要求しました。

Test-OutlookWebServices –Identity username
Get-OrganizationConfig

結果はまだ届いていません。他に確認すべき点がありましたらお知らせください。

4

2 に答える 2

7

クライアントがプロキシアドレスを持っていることはわかっていました。私たちが知らなかったのは、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行目の組み合わせを誤って変更するのを忘れるまで、上記の組み合わせを試したことはありません。:)

質問を見て答えてくれた皆さん、ありがとうございました。これがいつか誰かに役立つことを願っています。

于 2013-02-18T07:47:49.153 に答える
3

次のことを実現するには、トレースを有効にすることをお勧めします。

 Service.TraceEnabled = true;

私は同じ問題に直面していましたが、トレースを有効にすると、これらのトレースが正確に何が起こっているかを示します。私の場合、SSL証明書の問題はそれを解決するためにあります。

次のような多くの問題が発生する可能性があります。

  • ユーザーをブロックできます。

  • DSNがautodiscover.domain.comを見つけることができません

于 2013-12-09T15:43:06.530 に答える