C# 使用EWS列出所有可用的扩展属性

C# 使用EWS列出所有可用的扩展属性,c#,exchangewebservices,C#,Exchangewebservices,我试图找到一种方法,使用EWS列出一组日历项的所有扩展属性 问题是,我在网上找到的所有示例都要求我提前知道这些扩展属性是什么。这是我的建议 如果我不知道扩展属性的ID或名称,该怎么办?或者我甚至不知道是否存在任何扩展属性 我尝试了以下代码,但它返回了一个异常 var calendarItems = service.FindAppointments(WellKnownFolderName.Calendar, view); var propertySe

我试图找到一种方法,使用EWS列出一组日历项的所有扩展属性

问题是,我在网上找到的所有示例都要求我提前知道这些扩展属性是什么。这是我的建议

如果我不知道扩展属性的ID或名称,该怎么办?或者我甚至不知道是否存在任何扩展属性

我尝试了以下代码,但它返回了一个异常

            var calendarItems = service.FindAppointments(WellKnownFolderName.Calendar, view);
            var propertySet = new PropertySet(AppointmentSchema.ExtendedProperties);
            service.LoadPropertiesForItems(calendarItems, propertySet);
例外情况如下:


Microsoft.Exchange.WebServices.Data.ServiceResponseException:请求未通过架构验证:缺少必需的属性“FieldURI”。

EWS中没有调用以获取所有扩展属性。扩展属性背后的理念是应用程序使用它们存储特定于应用程序的数据,因此只有该应用程序需要知道其属性的细节


扩展MAPI可以发现此信息。有大量用于不同任务的示例代码,包括迭代命名属性。

我看起来也很相似,只是做了一种逆向工程。因为扩展属性是Id(integer)和数据类型的组合,我们无法知道,因为它们没有在任何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}");
    }
   }
}   
List allStringIds=new List();
对于(int i=0;i
{
尝试
{
ExtendedPropertyDefinition ExtendedPropertyDefinition=新的ExtendedPropertyDefinition(索引,
MapPropertyType.String);
latestMessage=EmailMessage.Bind(服务,item.Id.UniqueId,
新属性集(BasePropertySet.FirstClassProperties,extendedPropertyDefinition));
_Write(“支持的字符串属性id=“+索引”);
supportedListId.TryAdd(索引,索引);
}
捕获(例外情况除外)
{
}
});
foreach(supportedListId中的变量a)
{
ExtendedPropertyDefinition ExtendedPropertyDefinition=新的ExtendedPropertyDefinition(a.Key,
MapPropertyType.String);
添加(extendedPropertyDefinition);
}
latestMessage=EmailMessage.Bind(服务,item.Id.UniqueId,
新的PropertySet(BasePropertySet.FirstClassProperties,allExtendedPropertyDefinitions));
foreach(latestMessage.ExtendedProperties中的变量extendedProperty)
{
if(extendedProperty.PropertyDefinition!=null&&extendedProperty.PropertyDefinition.Tag!=null)
{
if(extendedProperty.Value!=null)
{
_Write($“OMG…extendedProperty id={extendedProperty.PropertyDefinition.id},”+
$“名称={extendedProperty.PropertyDefinition.name},值={extendedProperty.value}”);
}
}
}   

I second@Jason。扩展属性背后的基本思想是使移动/web应用程序能够存储与每个outlook项目关联的自定义数据,以便每次访问特定的outlook项目时,都能相应地对其进行处理。