我的公司在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();
}
答案 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。