簡體   English   中英

使用finditem()和getitems()獲取EWS約會

[英]Get EWS appointment using finditem() and getitems()

我正在使用finditem()和getitems()返回calendaritemtype和已加載的屬性。 該呼叫是在用戶提交約會后恰好10秒鍾進行的,我可以確認我在提交房間后第二秒鍾就收到了來自房間或資源的接受。 由於我的網站上人流量大,我需要在創建后立即檢查約會,以接受或拒絕房間,這會阻止同時預訂。 我拼湊了以下方法以返回與會者的響應,以便我可以按照確認的方式傳遞true或false。 當我運行此方法時,它列出了很多約會,但從未列出我剛剛創建的約會。

請記住,我立即從會議室收到一份ACCEPT,我只是無法進入calendaritemtype(約會)以編程方式獲得ACCEPT。

  1. 我是否需要調整findItem搜索,以便返回我的calendaritemtype(約會)?
  2. 我需要考慮同步嗎?

我在屬性中看到了與會者的手邊的項目,但它不是正確的項目。

這是我所說的方法:

public static ResponseInfo GetCalendarEvents(ExchangeServiceBinding esb, DateTime starttime, Reservation res, Patron pat)
{
    var startts = new TimeSpan(0, 0, 0, 0);
    var endts = new TimeSpan(0, 23, 59, 0);
    var endtime = new DateTime();

    //set timespan of date to beginning of dayy
    starttime = starttime.Date + startts;
    endtime = starttime.Date + endts;

    // Form the FindItem request.
    var findItemRequest = new FindItemType();
    var ce = new ResponseInfo();
    var calendarView = new CalendarViewType
    {
        StartDate = starttime,
        EndDate = endtime,
        MaxEntriesReturned = 100,
        MaxEntriesReturnedSpecified = true
    };

    findItemRequest.Item = calendarView;

    // Define which item properties are returned in the response.
    var itemProperties = new ItemResponseShapeType { BaseShape = DefaultShapeNamesType.IdOnly };

    // Define the traversal type.
    findItemRequest.Traversal = ItemQueryTraversalType.Shallow;

    // Use the Default shape for the response. 
    findItemRequest.ItemShape = itemProperties;

    // Identify which folders to search to find items.
    var folderIDArray = new DistinguishedFolderIdType[2];
    folderIDArray[0] = new DistinguishedFolderIdType();
    folderIDArray[0].Id = DistinguishedFolderIdNameType.calendar;

    // Add folders to the request.
    findItemRequest.ParentFolderIds = folderIDArray;

    try
    {
        // Send the FindItem request and get the response.
        var findItemResponse = esb.FindItem(findItemRequest);

        // Next, enumerate through the Items returned by FindItem.
        foreach (FindItemResponseMessageType responseMessage in findItemResponse.ResponseMessages.Items)
        {
            if (responseMessage.ResponseClass == ResponseClassType.Success)
            {
                var mailboxItems = (ArrayOfRealItemsType)responseMessage.RootFolder.Item;

                for (int itemCount = 0; itemCount < mailboxItems.Items.Length; itemCount++)
                {
                    var inboxItem = mailboxItems.Items[itemCount];
                    // Call GetItem on each ItemId to retrieve the 
                    // item's Body property and any AttachmentIds.
                    // Form the GetItem request.
                    var getItemRequest = new GetItemType
                    {
                        ItemShape = new ItemResponseShapeType { BaseShape = DefaultShapeNamesType.AllProperties }
                    };

                    // AllProperties on a GetItem
                    getItemRequest.ItemIds = new ItemIdType[1];
                    getItemRequest.ItemIds[0] = inboxItem.ItemId;

                    var getItemResponse = esb.GetItem(getItemRequest);

                    // We only passed in one ItemId to the GetItem
                    // request. Therefore, we can assume that
                    // we got at most one Item back.
                    var getItemResponseMessage = getItemResponse.ResponseMessages.Items[0] as ItemInfoResponseMessageType;
                    if (getItemResponseMessage != null)
                    {
                        if (getItemResponseMessage.ResponseClass == ResponseClassType.Success && getItemResponseMessage.Items.Items != null && getItemResponseMessage.Items.Items.Length > 0)
                        {
                            inboxItem = getItemResponseMessage.Items.Items[0];

                            var e = (CalendarItemType)inboxItem;


                            if (e.Start == res.Start && e.End == res.End)
                            {
                                foreach (AttendeeType at in e.RequiredAttendees)
                                {
                                    //attendee must accept meeting & attendee email must match email in reservation
                                    if (at.ResponseType == ResponseTypeType.Accept && at.Mailbox.EmailAddress == res.EmailAddress)
                                    {
                                        ce.Mailbox = at.Mailbox.EmailAddress;
                                        ce.ApptStart = e.Start;
                                        ce.ApptEnd = e.Start;
                                        ce.ApptResponse = ResponseTypeType.Accept;

                                        return ce;
                                    }
                                }
                            }
                        }
                        else
                        {
                            ce.Mailbox = "getItemResponseMessage.ResponseClass";
                            return ce;
                        }
                    }
                    else
                    {
                        ce.Mailbox = "getItemResponseMessage is null";
                        return ce;
                    }
                }
            }
            else
            {
                ce.Mailbox = "findItemResponseMessage is null";
                return ce;
            }
        }
    }
    catch (ServiceRequestException ex)
    {
        Logger.LogStringError("****Error****: GetCalendarEvents()...ServiceRequestException= " + ex);
    }
    catch (WebException ex)
    {
        Logger.LogStringError("****Error****: GetCalendarEvents()...WebException= " + ex);
    }
    catch (Exception ex)
    {
        Logger.LogStringError("****Error****: GetCalendarEvents()...Exception= " + ex);
    }

    return ce;
}

更新:由於這些原因,我的商品一直都在系統中,但我找不到它...

  1. Exchange以UTC格式存儲時間,因此,如果我離開窗口是一天(即12am-11:59 pm),並且我正在尋找9點至11點之間的約會,則finditem()將無法捕獲該約會,因為它被定義為UTC時間作為交換(在我的情況下,UTC時間提前5個小時,因此約會存儲在凌晨2-4點)。 確保您的窗口足夠大以應付UTC時間的差異...

      var calendarView = new CalendarViewType { StartDate = DateTime.Now.AddDays(-1), EndDate = DateTime.Now.AddDays(1), MaxEntriesReturned = 100, MaxEntriesReturnedSpecified = true }; 
  2. 確保在比較項目的屬性時間時,將時間轉換為localtime()...

      if (e.Start.ToLocalTime() == res.Start && e.End.ToLocalTime() == res.End) { foreach (AttendeeType at in e.RequiredAttendees) { //attendee must accept meeting & attendee email must match email in reservation if (at.ResponseType == ResponseTypeType.Accept && at.Mailbox.EmailAddress == res.EmailAddress) { ce.Mailbox = at.Mailbox.EmailAddress; ce.ApptStart = e.Start; ce.ApptEnd = e.Start; ce.ApptResponse = ResponseTypeType.Accept; calevents.Add(ce); } } } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM