2015-02-17 2 views
1

m проблема с Office 365 EWS (только Office 365, Exchange 2010 и 2013 работают нормально). Я могу создать нагрузочный подписку без ошибок, но когда я иду, чтобы использовать его по телефонуОшибка EWS ОшибкаNoRespondingCASInDestinationSite

getEvents() 

Я получаю сообщение об ошибке:

ErrorNoRespondingCASInDestinationSite

The following error occured while retrieving events for exchange resource: - Exchange Web Services are not currently available for this request because none of the Client Access Servers in the destination site could process the request.

Вот некоторые фрагменты кода

Использование автообнаружения и настройке удостоверяющие листы

this.exchangeService.Credentials = new NetworkCredential(this.Username, this.Password); 
        try { 
         this.exchangeService.AutodiscoverUrl(this.Username, RedirectionCallback); 
        } 
        catch(Exception ex) 
        { 
         Logger.WriteToEventLog(EventLogEntryType.Warning, 104, "ExchangeDataAccess, AutodiscoverURL error: " + ex.Message); 
        } 

        if (exchangeService.Url == null) 
        { 
         this.ExchangeServerURL = GetOffice365EWSUrl(this.Username); 
         this.exchangeService.Url = new Uri(this.ExchangeServerURL); 
         this.exchangeService.CookieContainer = new CookieContainer(); 
        } 

После того, как мы авторизуемся и находим, что наш пользователь обмена, выполнять все операции по

ServicePointManager.ServerCertificateValidationCallback = (sender1, certificate, chain, errors) => true; 

       string username = this.Username; 
       if (this.authenticateContext.GetExchangeServerVersion().Contains("365")) 
       { 
        username = this.Username.Remove(this.Username.IndexOf("@")); 
       } 

       NameResolutionCollection resolveNameResult = this.exchangeService.ResolveName(username, ResolveNameSearchLocation.ContactsThenDirectory, true); 

       if (resolveNameResult.Count() > 0) 
       { 
        roomEmailAddress = resolveNameResult[0].Mailbox.Address; 
        if (!string.IsNullOrEmpty(roomEmailAddress)) 
        { 
         this.ExchangeUserEmailAddress = roomEmailAddress; 
         logMsg.AppendLine("Logged into Exchange with " + roomEmailAddress + " successfully, RetrieveRoomsList is next"); 
        } 
       } 

Затем мы получаем SubscribeResponse и сохранить его в список

   subscribeResponse = this.exchangeDataAccess.ExchangeSubscribe(syncPoint.ThirdPartyId, syncPoint.Watermark, true); 

Проезжает выше объект в метод обертки, чтобы получить все события из EWS

 Dictionary<PullSubscription, IEnumerable<ItemEvent>> mailboxEvents = null; 

     GetEventsResults eventsResults = subscription.GetEvents(); 

     if (eventsResults == null || eventsResults.ItemEvents.Count() == 0) { 
      return mailboxEvents; 
     } 

     mailboxEvents = new Dictionary<PullSubscription, IEnumerable<ItemEvent>>(); 
     mailboxEvents.Add(subscription, eventsResults.ItemEvents); 
     return mailboxEvents; 

Линия, которая вызывает subscription.GetEvents(), где указано исключение, указанное в верхней части.
Существует еще один уровень сложности добавлен потому, что наш обмен пользователь имеет доменное имя @ FOOlab.onmicrosoft.com, где, как все номера управляются есть доменное имя @ LAB.FOO.COM

По клиент - это аутентификация ADFS, однако я действительно мало что знаю об этом.

Я могу сказать, однако, что эта база кода работала (получила события), а затем что-то изменилось, и ошибка начала появляться. Первоначально я думал, что клиент что-то изменил, но мы протестировали это против другого Office 365 (без ADFS) и увидели ту же ошибку, поэтому теперь я не знаю, что думать.

ответ

1

Приведенные ниже ссылки могут объяснить это гораздо лучше, чем я могу, но то, что я сделал до сих пор, который решил проблему, чтобы окружить GetEvents с оных и удаления данных заголовка X-AnchorMailbox MSDN Link1Link2

public Dictionary<PullSubscription, IEnumerable<ItemEvent>> GetEvents(SyncPoint syncpoint) 
     { 
      Dictionary<PullSubscription, IEnumerable<ItemEvent>> mailboxEvents = null; 

      if (this.authenticateContext.GetExchangeServerVersion().Contains("365")) 
      { 
       try 
       { 
        //this is to maintain affinity (see here https://msdn.microsoft.com/en-us/library/office/dn458789(v=exchg.150).aspx) 
        //it was added to fix an error: The following error occured while retrieving events for exchange resource: <room address> - Exchange Web Services are not currently available for this request because none of the Client Access Servers in the destination site could process the request. 
        //according to docs it is only when getting notifications that its important 
        if (this.exchangeService.HttpHeaders.Any(m => m.Key.Equals("X-AnchorMailbox"))) 
        { 
         this.exchangeService.HttpHeaders.Remove("X-AnchorMailbox"); 
        } 
        this.exchangeService.HttpHeaders.Add("X-AnchorMailbox", syncpoint.ThirdPartyId); //this is the email address of the mailbox being queried 
       } 
       catch { } 
      } 

      GetEventsResults eventsResults = syncpoint.pullSubscription.GetEvents(); 

      if (eventsResults == null || eventsResults.ItemEvents.Count() == 0) 
      { 
       return mailboxEvents; 
      } 

      mailboxEvents = new Dictionary<PullSubscription, IEnumerable<ItemEvent>>(); 
      mailboxEvents.Add(syncpoint.pullSubscription, eventsResults.ItemEvents); 

      try 
      { 
       this.exchangeService.HttpHeaders.Remove("X-AnchorMailbox"); 
      } catch { } 

      return mailboxEvents; 
     }