2010-03-30 8 views
4

Я пытаюсь найти сообщения между двумя датами из папки «Входящие». Я использую следующий restrictionType но он бросает эту ошибку:EWS - Как искать элементы [сообщение] между датами?

firmt.RootFolder = нуль

Что я делаю неправильно?

Существует несколько сообщений между датами ;-) упоминалось

Спасибо за ваши предложения.

 using (ExchangeServiceBinding esb = new ExchangeServiceBinding()) 
     { 
      esb.Url = ConfigurationManager.AppSettings["ExchangeWebServicesURL"].ToString(); 
      esb.RequestServerVersionValue = new RequestServerVersion(); 
      esb.RequestServerVersionValue.Version = ExchangeVersionType.Exchange2007_SP1; 
      esb.PreAuthenticate = true; 
      esb.Credentials = new NetworkCredential(email, password); 
      FindItemType findItemRequest = new FindItemType(); 
      // paging 
      IndexedPageViewType ipvt = new IndexedPageViewType(); 
      ipvt.BasePoint = IndexBasePointType.Beginning; 
      ipvt.MaxEntriesReturned = nombreMessage; 
      ipvt.MaxEntriesReturnedSpecified = true; 
      ipvt.Offset = offset; 
      findItemRequest.Item = ipvt; 
      // filter by dates 
      AndType andType = new AndType(); 
      List<SearchExpressionType> searchExps = new List<SearchExpressionType>(); 
      RestrictionType restriction = new RestrictionType(); 
      PathToUnindexedFieldType pteft = new PathToUnindexedFieldType 
      { 
       FieldURI = UnindexedFieldURIType.itemDateTimeSent 
      }; 
      IsGreaterThanOrEqualToType IsGreaterThanOrEqualTo = new IsGreaterThanOrEqualToType 
      { 
       Item = pteft, 
       FieldURIOrConstant = new FieldURIOrConstantType 
       { 
        Item = new ConstantValueType 
        { 
         Value = DateTime.Today.AddDays(-6d).ToString() 
        } 
       } 
      }; 
      searchExps.Add(IsGreaterThanOrEqualTo); 

      IsLessThanOrEqualToType IsLessThanOrEqualTo = new IsLessThanOrEqualToType 
      { 
       Item = pteft, 
       FieldURIOrConstant = new FieldURIOrConstantType 
       { 
        Item = new ConstantValueType 
        { 
         Value = DateTime.Today.AddDays(1d).ToString() 
        } 
       } 
      }; 
      searchExps.Add(IsLessThanOrEqualTo); 
      andType.Items = searchExps.ToArray(); 
      restriction.Item = andType; 
      findItemRequest.Restriction = restriction; 
      //// Define the sort order of items. 
      FieldOrderType[] fieldsOrder = new FieldOrderType[1]; 
      fieldsOrder[0] = new FieldOrderType(); 
      PathToUnindexedFieldType dateOrder = new PathToUnindexedFieldType 
      { 
       FieldURI = UnindexedFieldURIType.itemDateTimeReceived 
      }; 
      fieldsOrder[0].Item = dateOrder; 
      fieldsOrder[0].Order = SortDirectionType.Descending; 
      findItemRequest.SortOrder = fieldsOrder; 
      findItemRequest.Traversal = ItemQueryTraversalType.Shallow; 
      // define which item properties are returned in the response 
      findItemRequest.ItemShape = new ItemResponseShapeType 
      { 
       BaseShape = DefaultShapeNamesType.IdOnly 
      }; 
      // identify which folder to search 
      DistinguishedFolderIdType[] folderIDArray = new DistinguishedFolderIdType[1]; 
      folderIDArray[0] = new DistinguishedFolderIdType { Id = DistinguishedFolderIdNameType.inbox }; 
      // add folders to request 
      findItemRequest.ParentFolderIds = folderIDArray; 
      // find the messages 
      FindItemResponseType findItemResponse = esb.FindItem(findItemRequest); 
      //------------- 
      ArrayOfResponseMessagesType responseMessages = findItemResponse.ResponseMessages; 
      ResponseMessageType responseMessage = responseMessages.Items[0]; 
      if (responseMessage is FindItemResponseMessageType) 
      { 
       FindItemResponseMessageType firmt = (responseMessage as FindItemResponseMessageType); 
     *******FindItemParentType fipt = firmt.RootFolder;******** 
       object obj = fipt.Item; 
       // FindItem contains an array of items. 
       ArrayOfRealItemsType realitems = (obj as ArrayOfRealItemsType); 
       ItemType[] items = realitems.Items; 
       // if no messages were found, then return null -- we're done 
       if (items == null || items.Count() <= 0) 
        return null; 
       // FindItem never gets "all" the properties, so now that we've found them all, we need to get them all. 
       BaseItemIdType[] itemIds = new BaseItemIdType[items.Count()]; 
       for (int i = 0; i < items.Count(); i++) 
        itemIds[i] = items[i].ItemId; 
       GetItemType getItemType = new GetItemType 
       { 
        ItemIds = itemIds, 
        ItemShape = new ItemResponseShapeType 
        { 
         BaseShape = DefaultShapeNamesType.AllProperties, 
         BodyType = BodyTypeResponseType.Text, 
         BodyTypeSpecified = true, 
         AdditionalProperties = new BasePathToElementType[] { 
          new PathToUnindexedFieldType { FieldURI = UnindexedFieldURIType.itemDateTimeSent }, 
          new PathToUnindexedFieldType { FieldURI = UnindexedFieldURIType.messageFrom }, 
          new PathToUnindexedFieldType { FieldURI = UnindexedFieldURIType.messageIsRead }, 
          new PathToUnindexedFieldType { FieldURI = UnindexedFieldURIType.messageSender }, 
          new PathToUnindexedFieldType { FieldURI = UnindexedFieldURIType.messageToRecipients }, 
          new PathToUnindexedFieldType { FieldURI = UnindexedFieldURIType.messageCcRecipients }, 
          new PathToUnindexedFieldType { FieldURI = UnindexedFieldURIType.messageBccRecipients } 
         } 
        } 
       }; 
       GetItemResponseType getItemResponse = esb.GetItem(getItemType); 
       messages = ReadItems(getItemResponse, items.Count()); 
      } 
+0

На какой строке исключено исключение? Это очень много кода. Вам нужно определить, где эта проблема возникает, а не размещать всю вашу программу. –

+0

Да, извините, но, поскольку я не знал, где проблема, я отправил всю цепочку кода. Исключение расположено после строки со звездочками **********, а значение fipt равно null. После глубокого сеанса отладки я обнаружил, что responseMessage.MessageText имеет следующий контент «Указанное значение недействительно для свойства». и указанное значение - «FieldURI». здесь значение свойства MessageXml: И значение равно null. – SomFred

ответ

4

Я нашел ответ самостоятельно после длительного поиска формата даты.

ограничений, должен быть определен, как это:

// greater or equal to 
string dateStart = DateTime.Today.add(-6d); 
string dateEnd = DateTime.Today.Add(1d); 

PathToUnindexedFieldType dateSentPath = new PathToUnindexedFieldType(); 
dateSentPath.FieldURI = UnindexedFieldURIType.itemDateTimeSent; 
IsGreaterThanOrEqualToType IsGreaterThanOrEqual = new IsGreaterThanOrEqualToType(); 
IsGreaterThanOrEqual.Item = dateSentPath; 
FieldURIOrConstantType dateConstant = new FieldURIOrConstantType(); 
ConstantValueType dateConstantValue = new ConstantValueType(); 
dateConstantValue.Value = string.Format("{0}-{1}-{2}T00:00:00Z", dateStart.Year.ToString(), dateStart.Month.ToString(), dateStart.Day.ToString()); 
dateConstant.Item = dateConstantValue; 
IsGreaterThanOrEqual.FieldURIOrConstant = dateConstant; 

// less than or equal to 
PathToUnindexedFieldType dateSentPath1 = new PathToUnindexedFieldType(); 
dateSentPath1.FieldURI = UnindexedFieldURIType.itemDateTimeSent; 
IsLessThanOrEqualToType lessThanOrEqualTo = new IsLessThanOrEqualToType(); 
lessThanOrEqualTo.Item = dateSentPath1; 
FieldURIOrConstantType dateConstant1 = new FieldURIOrConstantType(); 
ConstantValueType dateConstantValue1 = new ConstantValueType(); 
dateConstantValue1.Value = string.Format("{0}-{1}-{2}T00:00:00Z", dateEnd.Year.ToString(), dateEnd.Month.ToString(), dateEnd.Day.ToString()); 
dateConstant1.Item = dateConstantValue1; 
lessThanOrEqualTo.FieldURIOrConstant = dateConstant1; 

RestrictionType restriction = new RestrictionType(); 
AndType andType = new AndType(); 
andType.Items = new SearchExpressionType[] { lessThanOrEqualTo, IsGreaterThanOrEqual }; 
restriction.Item = andType; 
findItemRequest.Restriction = restriction; 

Надеется, что это поможет кому-то когда-нибудь ;-)

0

В случае, если кто натыкается на это в будущем, EWS получил еще более строги форматирование даты. Принятое форматирование ответа работает в течение двухзначных месяцев, но не для отдельных цифр.

форматирования, который работает во всех случаях:

DateTime.Today.AddDays(15).ToString("yyyy-MM-ddThh:mm:ssZ") 
0

Сужение также работает с использованием «Сортируемый шаблон даты/времени».

Datetime.Now.ToString("s")