C# Exchange Service突然报错属性Hashtags仅对Exchange Exchange2015或更高版本有效

LMS*_*LMS 5 c# exchange-server hashtag

我有一个用 C# 编写的 Windows 服务,它轮询 Exchange 服务器来处理发送到无人值守电子邮件箱的邮件。

它一直工作正常,直到今天它抛出以下错误:-

EXCEPTION: Microsoft.Exchange.WebServices.Data.ServiceVersionException: The property Hashtags is valid only for Exchange Exchange2015 or later versions.
   at Microsoft.Exchange.WebServices.Data.PropertyBag.set_Item(PropertyDefinition propertyDefinition, Object value)
   at Microsoft.Exchange.WebServices.Data.ComplexPropertyDefinitionBase.InternalLoadFromXml(EwsServiceXmlReader reader, PropertyBag propertyBag)
   at Microsoft.Exchange.WebServices.Data.ComplexPropertyDefinitionBase.LoadPropertyValueFromXml(EwsServiceXmlReader reader, PropertyBag propertyBag)
   at Microsoft.Exchange.WebServices.Data.PropertyBag.LoadFromXml(EwsServiceXmlReader reader, Boolean clear, PropertySet requestedPropertySet, Boolean onlySummaryPropertiesRequested)
   at Microsoft.Exchange.WebServices.Data.ServiceObject.LoadFromXml(EwsServiceXmlReader reader, Boolean clearPropertyBag, PropertySet requestedPropertySet, Boolean summaryPropertiesOnly)
   at Microsoft.Exchange.WebServices.Data.EwsServiceXmlReader.ReadServiceObjectsCollectionFromXml[TServiceObject](XmlNamespace collectionXmlNamespace, String collectionXmlElementName, GetObjectInstanceDelegate`1 getObjectInstanceDelegate, Boolean clearPropertyBag, PropertySet requestedPropertySet, Boolean summaryPropertiesOnly)
   at Microsoft.Exchange.WebServices.Data.EwsServiceXmlReader.ReadServiceObjectsCollectionFromXml[TServiceObject](String collectionXmlElementName, GetObjectInstanceDelegate`1 getObjectInstanceDelegate, Boolean clearPropertyBag, PropertySet requestedPropertySet, Boolean summaryPropertiesOnly)
   at Microsoft.Exchange.WebServices.Data.GetItemResponse.ReadElementsFromXml(EwsServiceXmlReader reader)
   at Microsoft.Exchange.WebServices.Data.ServiceResponse.LoadFromXml(EwsServiceXmlReader reader, String xmlElementName)
   at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.ParseResponse(EwsServiceXmlReader reader)
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ParseResponse(EwsServiceXmlReader reader, WebHeaderCollection responseHeaders)
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ReadResponse(EwsServiceXmlReader ewsXmlReader, WebHeaderCollection responseHeaders)
   at Microsoft.Exchange.WebServices.Data.SimpleServiceRequestBase.ReadResponseXml(Stream responseStream, WebHeaderCollection responseHeaders)
   at Microsoft.Exchange.WebServices.Data.SimpleServiceRequestBase.ReadResponse(IEwsHttpWebResponse response)
   at Microsoft.Exchange.WebServices.Data.SimpleServiceRequestBase.InternalExecute()
   at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.Execute()
   at Microsoft.Exchange.WebServices.Data.ExchangeService.InternalLoadPropertiesForItems(IEnumerable`1 items, PropertySet propertySet, ServiceErrorHandling errorHandling)
   at Microsoft.Exchange.WebServices.Data.ExchangeService.LoadPropertiesForItems(IEnumerable`1 items, PropertySet propertySet)
   at MyServiceName.MyServiceName.CheckForNewEmails(ExchangeService service) in C:\TFSOnline\RPM Tools\MyServiceName\MyServiceName\MyServiceName.cs:line 177
   at MyServiceName.MyServiceName.RunACheck(Object state) in C:\TFSOnline\RPM Tools\MyServiceName\MyServiceName\MyServiceName.cs:line 117
Run Code Online (Sandbox Code Playgroud)

导致崩溃的行是:

PropertySet properties = (BasePropertySet.FirstClassProperties);
service.LoadPropertiesForItems(emails, properties);
Run Code Online (Sandbox Code Playgroud)

具体错误是:

Microsoft.Exchange.WebServices.Data.ServiceVersionException: 
The property Hashtags is valid only for Exchange Exchange2015 or later versions.
Run Code Online (Sandbox Code Playgroud)

我没有在任何地方使用或访问主题标签,因此它可能包含在 BasePropertySet.FirstClassProperties 中。

正如我所提到的,到目前为止我一直很高兴地使用上面的代码,它今天才开始出现此错误。

我正在使用最新的 EWS 稳定版本:Exchange.WebServices.Managed.Api 2.2.1.1

BasePropertySet 只有另一项 IdOnly,而我想要的属性是 InternetMessageId,所以我想我只需使用它:

PropertySet properties = (BasePropertySet.IdOnly);
service.LoadPropertiesForItems(emails, properties);
Run Code Online (Sandbox Code Playgroud)

事实证明 InternetMessageId 不属于获取 ID 的属性范围...

EXCEPTION: Microsoft.Exchange.WebServices.Data.ServiceObjectPropertyException: 
You must load or assign this property before you can read its value.
   at Microsoft.Exchange.WebServices.Data.PropertyBag.get_Item(PropertyDefinition propertyDefinition)
   at Microsoft.Exchange.WebServices.Data.EmailMessage.get_InternetMessageId()
Run Code Online (Sandbox Code Playgroud)

给出错误的代码部分没有更改,据我所知,Office 365 没有任何更新影响 Exchange。

为了仔细检查,我采用了以前的版本(编译的代码,而不是我重新编译的源代码)并安装了它:仍然遇到相同的错误。

以前有人遇到过这个错误吗?我用谷歌搜索过,但没有得到任何结果。

编辑:尝试在另一台计算机上安装该服务,因为它可能特定于它所在的计算机。

即使使用以前的代码,仍然会出现相同的错误。

Han*_*aga 5

这段代码对我有用。我需要添加“new PropertySet”才能使其正常工作。

foreach (var email in emails)
{
    try {
        var list = new List<EmailMessage> { email };
        PropertySet properties = new PropertySet(BasePropertySet.FirstClassProperties);
        service.LoadPropertiesForItems(list, properties);
        <Process Email>
    }
}
Run Code Online (Sandbox Code Playgroud)

但最终使它起作用的是将 Exchange 版本从 Exchange2013 设置为 Exchange2015:

旧代码:

    service = new ExchangeService(ExchangeVersion.Exchange2013)
    {
        Credentials = new WebCredentials(user, password),
        TraceEnabled = false,
        TraceFlags = TraceFlags.None
    };
Run Code Online (Sandbox Code Playgroud)

新代码:

    service = new ExchangeService(ExchangeVersion.Exchange2015)
    {
        Credentials = new WebCredentials(user, password),
        TraceEnabled = false,
        TraceFlags = TraceFlags.None
    };
Run Code Online (Sandbox Code Playgroud)


LMS*_*LMS 0

解决了。事实证明这是一封特定电子邮件中的内容。

最初代码的顺序如下:-

PropertySet properties = (BasePropertySet.FirstClassProperties);
service.LoadPropertiesForItems(emails, properties);

foreach (var email in emails)
{
    try {
        <Process Email>
    }
}
Run Code Online (Sandbox Code Playgroud)

我将代码重新排序为:-

foreach (var email in emails)
{
    try {
        var list = new List<EmailMessage> { email };
        PropertySet properties = (BasePropertySet.FirstClassProperties);
        service.LoadPropertiesForItems(list, properties);
        <Process Email>
    }
} 
Run Code Online (Sandbox Code Playgroud)

因此,单独获取每封电子邮件的属性,而不是一起获取所有属性。必须通过列表完成,因为这就是 LoadPropertiesForItems 所需要的。

在这种情况下,其中一封电子邮件的某些内容(可能是主题标签属性)导致了错误。

现在,所有其余电子邮件均已正确处理,并且导致错误的电子邮件将被跳过。

虽然令人烦恼的是,因为我无法访问属性,所以我实际上无法记录有关它的任何信息。