代码之家  ›  专栏  ›  技术社区  ›  FlyingStreudel

EWS编辑RequiredAttendes时:“设置操作对属性无效”

  •  5
  • FlyingStreudel  · 技术社区  · 8 年前

    RequiredAttendees 预约的财产。

    Set action is invalid for property.

    查看异常详细信息表明,它确实是 所需与会者

    我用来连接到该服务的凭据是会议组织者的凭据,我甚至尝试过不走运地模拟该用户。挠头想弄清楚这里出了什么问题。

    以下是导致问题的更新例程的相关部分。

    PropertySet props = new PropertySet(
            AppointmentSchema.Start,
            AppointmentSchema.End,
            AppointmentSchema.Id,
            AppointmentSchema.Organizer,
            AppointmentSchema.Subject,
            AppointmentSchema.Body,
            AppointmentSchema.RequiredAttendees);
    props.RequestedBodyType = BodyType.Text;
    
    Appointment appointment = Appointment.Bind(_service, new ItemId(appointmentId), props);
    
    if (IsResource(appointment.Organizer.Address) && appointment.Organizer.Address != resourceId)
    {
        /*
        * removed for brevity, no attendee manipulation here
        */
    }
    else 
    {
        List<Attendee> remove = new List<Attendee>();
        foreach (var attendee in appointment.RequiredAttendees)
        {
            if (IsResource(attendee.Address) && attendee.Address != resourceId)
            {
                remove.Add(attendee);
            }
        }
        remove.ForEach(a => appointment.RequiredAttendees.Remove(a));
        if (!appointment.RequiredAttendees.Any(a => a.Address == resourceId))
        {
            appointment.RequiredAttendees.Add(resourceId);
        }
    }
    
    /*
    * removed for brevity, no attendee manipulation here
    */
    
    if (IsAvailable(resourceId, startTime, endTime, appointmentId))
        appointment.Update(ConflictResolutionMode.AlwaysOverwrite, SendInvitationsOrCancellationsMode.SendToAllAndSaveCopy);
    else
        throw new RoomUnavailableException();
    

    请求跟踪:

    <Trace Tag = "EwsRequest" Tid="14" Time="2017-09-25 20:20:24Z" Version="15.00.0847.030">
      <?xml version = "1.0" encoding="utf-8"?>
      <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <soap:Header>
          <t:RequestServerVersion Version = "Exchange2013" />
        </ soap:Header>
        <soap:Body>
          <m:UpdateItem ConflictResolution = "AlwaysOverwrite" SendMeetingInvitationsOrCancellations="SendToAllAndSaveCopy">
            <m:ItemChanges>
              <t:ItemChange>
                <t:ItemId Id = "AAMkAGEwYWRjZjA3LWNlZjAtNDI2Ny05ZjQwLWUzYWZjOThhMjkzNwBGAAAAAABWdX+yf6THTpO/1LYpoG6xBwD6lEwS6u8XQbDhIlTh/X/UAAAAAAENAAD6lEwS6u8XQbDhIlTh/X/UAAAi3oSdAAA=" ChangeKey="DwAAABYAAAD6lEwS6u8XQbDhIlTh/X/UAAAi3ocU" />
                <t:Updates>
                  <t:SetItemField>
                    <t:FieldURI FieldURI = "calendar:RequiredAttendees" />
                    < t:CalendarItem>
                      <t:RequiredAttendees>
                        <t:Attendee>
                          <t:Mailbox>
                            <t:Name>Exchange Test</t:Name>
                            <t:EmailAddress>etest @supertester.com</t:EmailAddress>
                            <t:RoutingType>SMTP</t:RoutingType>
                            <t:MailboxType>Mailbox</t:MailboxType>
                          </t:Mailbox>
                        </t:Attendee>
                        <t:Attendee>
                          <t:Mailbox>
                            <t:EmailAddress>redroom @supertester.com</t:EmailAddress>
                          </t:Mailbox>
                        </t:Attendee>
                      </t:RequiredAttendees>
                    </t:CalendarItem>
                  </t:SetItemField>
                </t:Updates>
              </t:ItemChange>
            </m:ItemChanges>
          </m:UpdateItem>
        </soap:Body>
      </soap:Envelope>
    </Trace>
    

    <Trace Tag = "EwsResponse" Tid="14" Time="2017-09-25 20:20:24Z" Version="15.00.0847.030">
      <?xml version = "1.0" encoding="utf-8"?>
      <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
        <s:Header>
          <h:ServerVersionInfo MajorVersion = "15" MinorVersion="1" MajorBuildNumber="225" MinorBuildNumber="41" Version="V2_48" xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
        </s:Header>
        <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          <m:UpdateItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
            <m:ResponseMessages>
              <m:UpdateItemResponseMessage ResponseClass = "Error" >
                <m:MessageText>Set action is invalid for property.</m:MessageText>
                <m:ResponseCode>ErrorInvalidPropertySet</m:ResponseCode>
                <m:DescriptiveLinkKey>0</m:DescriptiveLinkKey>
                <m:MessageXml>
                  <t:FieldURI FieldURI = "calendar:RequiredAttendees" />
                </m:MessageXml>
                <m:Items />
              </m:UpdateItemResponseMessage>
            </m:ResponseMessages>
          </m:UpdateItemResponse>
        </s:Body>
      </s:Envelope>
    </Trace>
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   FlyingStreudel    8 年前

    非常感谢Glen Scales为我指出了正确的方向。

    CalendarFolder calendar = CalendarFolder.Bind(_service, new FolderId(WellKnownFolderName.Calendar, resourceId), PropertySet.IdOnly);
    CalendarView cView = new CalendarView(startDate, endDate, _maxAppointments);
    cView.PropertySet = new PropertySet(PropertySet.IdOnly);
    FindItemsResults<Appointment> appointments = calendar.FindAppointments(cView);
    

    resourceId 是房间邮箱的地址,而不是会议的组织者。

    this post ):

    appointment = FindOrganizerAppointment(appointment);
    
    /// <summary>
    /// Finds the related Appointment.
    /// </summary>
    /// <param name="appointment">The appointment whose original is to be found.</param>
    /// <returns></returns>
    private Appointment FindOrganizerAppointment(Appointment appointment)
    {
        try
        {
            Impersonate(appointment.Organizer.Address);
    
            var filter = new SearchFilter.IsEqualTo
            {
                PropertyDefinition = new ExtendedPropertyDefinition
                    (DefaultExtendedPropertySet.Meeting, 0x03, MapiPropertyType.Binary),
                Value = GetObjectIdStringFromUid(appointment.ICalUid)
            };
    
            var view = new ItemView(1) { PropertySet = new PropertySet(BasePropertySet.FirstClassProperties) };
    
            return _service.FindItems(WellKnownFolderName.Calendar, filter, view).Items[0] as Appointment;
        }
        catch (Exception e)
        {
             throw e;
        }
        finally
        {
            DisableImpersonation();
        }
    }
    
    /// <summary>
    /// Gets the object id string from uid.
    /// <remarks>The UID is formatted as a hex-string and the GlobalObjectId is displayed as a Base64 string.</remarks>
    /// </summary>
    /// <param name="id">The uid.</param>
    /// <returns></returns>
    private static string GetObjectIdStringFromUid(string id)
    {
        var buffer = new byte[id.Length / 2];
        for (int i = 0; i < id.Length / 2; i++)
        {
            var hexValue = byte.Parse(id.Substring(i * 2, 2), System.Globalization.NumberStyles.AllowHexSpecifier);
            buffer[i] = hexValue;
        }
        return Convert.ToBase64String(buffer);
    }
    
        2
  •  1
  •   Sivakrishna Donepudi    8 年前

    请注意,“RequiredAttendes”对象只有在它是会议时才会被填充。

    在您的else声明中添加此支票

    if(appointment.IsMeeting)
    {
      List<Attendee> remove = new List<Attendee>();
     foreach (var attendee in appointment.RequiredAttendees)
     {
        if (IsResource(attendee.Address) && attendee.Address != resourceId)
        {
            remove.Add(attendee);
        }
     }
     remove.ForEach(a => appointment.RequiredAttendees.Remove(a));
     if (!appointment.RequiredAttendees.Any(a => a.Address == resourceId))
     {
        appointment.RequiredAttendees.Add(resourceId);
     }
    }
    

    MSDN link