2016-03-10 1 views
2

Моя компания находится в офисе 365. Моя цель состоит в том, чтобы найти предложенные вами контакты Outlook в приложении asp .net MVC (контакты, отображаемые в списке автозаполнения). Веб-сайт настроен для автоматического входа в систему с аутентификацией Windows, и я не хочу спрашивать у пользователя его учетные данные.Получить рекомендуемые контакты Outlook

Я должен пытались получить предлагаемые контакты с помощью Exchange Web Service, но я только удастся получить «реальные» контакты, используя этот код:

public List<Contact> GetContacts() 
{ 
    ContactsFolder.Bind(this._service, WellKnownFolderName.Contacts); 
    ItemView itemView = new ItemView(1000); 
    itemView.PropertySet = new PropertySet(BasePropertySet.IdOnly, new PropertyDefinitionBase[4] 
    { 
    (PropertyDefinitionBase) ContactSchema.DisplayName, 
    (PropertyDefinitionBase) ContactSchema.Surname, 
    (PropertyDefinitionBase) ContactSchema.GivenName, 
    (PropertyDefinitionBase) ContactSchema.EmailAddress1 
    }); 
    FindItemsResults<Item> items = this._service.FindItems(WellKnownFolderName.Contacts, (ViewBase) itemView); 
    List<Contact> list = new List<Contact>(); 
    foreach (Item obj in items) 
    { 
    if (obj is Contact) 
     list.Add(obj as Contact); 
    } 
    return list; 
} 

Затем я попытался с помощью People Api of Office 365 REST API, но я не знаю, как позвонить, не спрашивая логин/пароль пользователя. Это образец попытки (если не использовать прокси-сервер, я получаю HTTP 407 Error):

public async Task Try() 
    { 
     var proxy = WebRequest.GetSystemWebProxy(); 
     proxy.Credentials = new NetworkCredential("foo", "1234"); 


     // Now create a client handler which uses that proxy 
     HttpClient client = null; 
     HttpClientHandler httpClientHandler = new HttpClientHandler() 
     { 
      Proxy = proxy, 
      PreAuthenticate = true, 
      UseDefaultCredentials = false, 
      Credentials = new NetworkCredential("[email protected]", "1234") 
     }; 
     var httpClient = new HttpClient(httpClientHandler); 
     var result = await httpClient.GetAsync("https://outlook.office.com/api/beta/me/people"); 

     var stringContent = await result.Content.ReadAsStringAsync(); 
    } 
+0

любое обновление? –

+0

Да, я обновил сообщение с результатами моих исследований. Извините за задержку. – Pak

ответ

1

Я никогда не встречал папку «Рекомендуемые контакты» post. Я закончил с помощью папки «AllContacts», которая, похоже, выполняет эту работу.

public List<Contact> GetSuggestedContacts() 
    { 
     // Instantiate the item view with the number of items to retrieve from the Contacts folder. 
     ItemView view = new ItemView(1000); 

     // To keep the request smaller, request only the display name property. 
     view.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties, ContactSchema.DisplayName, ContactSchema.Surname, ContactSchema.GivenName, ContactSchema.EmailAddress1); 

     // Retrieve the RecipientCache folder in the Contacts folder that have the properties that you selected. 
     var contactFolders = _service.FindFolders(new FolderId(WellKnownFolderName.Root), new FolderView(500)); 
     var folder = contactFolders.Folders.SingleOrDefault(x => x.DisplayName == "AllContacts"); 

     if(folder == null) return new List<Contact>(); 

     //Cast Item in Contact and filtered only real adresses 
     var cacheContacts = folder.FindItems(view).Items.OfType<Contact>().Where(x => x.EmailAddresses.Contains(0) && x.EmailAddresses[0].Address != null && x.EmailAddresses[0].Address.Contains('@')).ToList(); 

     return cacheContacts; 
    } 

Я также нашел службу ResolveName Обмена, что я мог бы использовать для автозаполнения.

1

О РЕКОМЕНДУЕМЫЙ Контакт проблемы

То, что я имею в виду, что вы не смотрите в правильная папка. Из того, что я видел по поисковым запросам, предлагаемые контакты не указаны в Контакты Справочник, но в Предлагаемые контакты. В вашем примере EWS вы ищете Контакты ... См. this discussion. Посмотрите также на this guy post, ему удастся получить доступ к папке «Рекомендуемые контакты» с EWS и powershell, поэтому нет сомнений, что это возможно с C# и EWS .NET SDK. Мой совет продолжать пытаться с образцом 1.

О проблеме аутентификации

Позвольте мне подчеркнуть тот факт, что ваши запросы должны быть разрешен доступ как веб-служб Exchange (код образца 1) или внешний вид REST API (образец кода 2).

В примере 1 мы не видим, как создается поле _service, но я уверен, что есть фрагмент кода, который более или менее выглядит ниже, поэтому вы можете запросить EWS.

ExchangeService service = new ExchangeService(); 
service.Credentials = new OAuthCredentials(token); 
service.Url = new Uri(ewsUrl); 

token может быть, вероятно, повторно использовать для API Перспективы REST, попробуйте установить его в носитель в httpClient

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "Your Oauth token");

Теперь ваш запрос должен быть авторизован, но вы по-прежнему иметь свой прокси проблема. Готов поспорить, что это происходит только внутри вашей организации, потому что ваша ИТ-система настроена на прокси-сервер. Вы, вероятно, не будете нуждаться в нем в производстве. Вы можете использовать оператор отладки, чтобы заставить его работать, пока вы разрабатываете локально.

#if DEBUG 
IWebProxy webProxy = System.Net.WebRequest.DefaultWebProxy; 
if (webProxy!=null && !webProxy.IsBypassed(new Uri(endpoint))) 
    { 
     client.Proxy = webProxy; 
    } 
#endif 
+0

Спасибо за ваш совет по пребыванию с образцом 1.Спасибо также за вклад в проблему аутентификации, я думаю, что это будет полезно когда-нибудь! : D – Pak