检索Outlook的建议联系人

时间:2016-03-10 08:59:05

标签: c# asp.net outlook office365 exchangewebservices

我的公司在Office 365下。 我的目标是在我的asp .net MVC应用程序(自动填充列表中显示的联系人)中检索Outlook的用户建议联系人。 该网站配置为使用Windows身份验证自动登录,我不想向用户询问他的凭据。

我必须尝试使用​​Exchange Web服务检索建议的联系人,但我只能成功检索" real"使用此代码进行联系:

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("foo@foo.com", "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();
    }

2 个答案:

答案 0 :(得分:1)

关于建议的联系问题

我在想的是你没有找到合适的文件夹。通过谷歌搜索看到的建议的联系人不在联系人目录中,而是在建议的联系人中。在您的EWS示例中,您正在查找联系人... 见this discussion。同样在this guy post,他设法访问带有EWS和powershell的Suggested Contacts文件夹,因此毫无疑问这对C#和EWS .NET SDK来说是可行的。我的建议是继续尝试你的样品1。

关于身份验证问题

我要强调,您的请求应该被授权访问Exchange Web服务(代码示例1)或Outlook REST API(代码示例2)。

在示例1中,我们没有看到_service字段是如何实例化的,但我敢打赌,有一段代码看起来或多或少的下面的行,因此您可以请求EWS。

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

token可能可能重用于Outlook REST API,尝试将其设置为httpClient

中的承载

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

现在您的请求应该获得授权,但您仍然遇到代理问题。我敢打赌,这只发生在您的组织中,因为您的IT设置了代理。你可能不需要它在生产中。您可以使用调试语句使其在本地开发时工作。

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

答案 1 :(得分: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;
    }

我还找到了可以用于自动完成的Exchange服务ResolveName