我试图找到一种方法,使用EWS列出一组日历项目的所有扩展属性。
问题在于,我设法在网上找到的所有示例都要求我提前知道这些扩展属性是什么。这是official MSDN example。
如果我不知道扩展属性的ID或名称,我该怎么办?或者,如果我甚至不知道是否存在任何扩展属性?
我已经尝试了以下代码,但它返回了异常...
var calendarItems = service.FindAppointments(WellKnownFolderName.Calendar, view);
var propertySet = new PropertySet(AppointmentSchema.ExtendedProperties);
service.LoadPropertiesForItems(calendarItems, propertySet);
这是例外:
Microsoft.Exchange.WebServices.Data.ServiceResponseException: The request failed schema validation: The required attribute 'FieldURI' is missing.
答案 0 :(得分:5)
EWS中没有调用来获取所有扩展属性。扩展属性背后的想法是应用程序使用它们来存储特定于应用程序的数据,因此只有该应用程序需要知道其属性的具体信息。
扩展MAPI可以发现此信息。 http://mfcmapi.codeplex.com/有大量不同任务的示例代码,包括迭代命名属性。
答案 1 :(得分:0)
我看起来也很相似,我只是做了一种逆向工程。由于扩展属性是 Id(整数)和数据类型的组合,我们无法知道,因为它们没有记录在任何 MSDN 上。因此,对于字符串类型的属性,将 1 迭代为 15000 之类的大数字,然后找到那些可以成功加载的数字 - 这是我们可以通过放置 try-catch 来绑定该扩展属性来完成的最棘手的部分。然后你可以得到所需的一个。 希望有所帮助。
List<int> allStringIds = new List<int>();
for (int i = 0; i <= 15000; i++)
{
allStringIds.Add(i);
}
ParallelOptions options = new ParallelOptions
{
MaxDegreeOfParallelism = 200,
CancellationToken = CancellationToken.None,
};
Parallel.For(0, allStringIds.Count, options, index =>
{
try
{
ExtendedPropertyDefinition extendedPropertyDefinition = new ExtendedPropertyDefinition(index,
MapiPropertyType.String);
latestMessage = EmailMessage.Bind(service, item.Id.UniqueId,
new PropertySet(BasePropertySet.FirstClassProperties, extendedPropertyDefinition));
_logger.Write("Supported string property id=" + index);
supportedListId.TryAdd(index, index);
}
catch(Exception ex)
{
}
});
foreach (var a in supportedListId)
{
ExtendedPropertyDefinition extendedPropertyDefinition = new ExtendedPropertyDefinition(a.Key,
MapiPropertyType.String);
allExtendedPropertyDefinitions.Add(extendedPropertyDefinition);
}
latestMessage = EmailMessage.Bind(service, item.Id.UniqueId,
new PropertySet(BasePropertySet.FirstClassProperties, allExtendedPropertyDefinitions));
foreach (var extendedProperty in latestMessage.ExtendedProperties)
{
if (extendedProperty.PropertyDefinition != null && extendedProperty.PropertyDefinition.Tag != null)
{
if (extendedProperty.Value != null)
{
_logger.Write($"OMG... extendedProperty id={extendedProperty.PropertyDefinition.Id}," +
$" name={ extendedProperty.PropertyDefinition.Name}, value={extendedProperty.Value}");
}
}
}