EWS:更新约会的RequiredAttendees时,设置操作对于属性无效

时间:2012-04-02 16:59:30

标签: exchangewebservices exchange-server-2010

我正在尝试更新现有的约会,但EWS正在抛出"Set action is invalid for property."。我查看了设置为约会对象的所有值,但我无法确定此错误的实际原因。

这是我的代码段:

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
service.Credentials = new WebCredentials("ews_calendar", PASSWORD, "acme");
service.Url = new Uri("https://acme.com/EWS/Exchange.asmx");
ImpersonatedUserId impUser = new ImpersonatedUserId();
service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, "tin.tin@acme.com");

string itemId = "";
DateTime PreviousStartDate = new DateTime(2012, 04, 02, 18, 00, 00);
DateTime PreviousEndDate = new DateTime(2012, 04, 02, 18, 30, 00);
CalendarView calView = new CalendarView(PreviousStartDate, PreviousEndDate);
Appointment appointment = new Appointment(service);
try
{
    calView.PropertySet = new PropertySet(BasePropertySet.IdOnly, AppointmentSchema.Subject, AppointmentSchema.Start, AppointmentSchema.IsRecurring, AppointmentSchema.AppointmentType);
    FindItemsResults<Appointment> findResults = service.FindAppointments(WellKnownFolderName.Calendar, calView);

    List<Item> items = new List<Item>();
    foreach (Appointment appt in findResults.Items)
    {
        appt.Load();
        items.Add(appt);
    }

    if (items.Count > 0)
    {
        service.LoadPropertiesForItems(items, PropertySet.FirstClassProperties);
        appointment = (Appointment) items[0];
        appointment.Load(new PropertySet(BasePropertySet.IdOnly, AppointmentSchema.Start, AppointmentSchema.ReminderDueBy, AppointmentSchema.End, AppointmentSchema.StartTimeZone, AppointmentSchema.EndTimeZone, AppointmentSchema.TimeZone));
    }

    appointment.RequiredAttendees.Add("tin.tin@acme.com");

    appointment.Start = new DateTime(2012, 04, 02, 18, 00, 0);
    appointment.End = new DateTime(2012, 04, 02, 18, 30, 0);

    // throwing exception here -- Set action is invalid for property.
    appointment.Update(ConflictResolutionMode.AlwaysOverwrite, SendInvitationsOrCancellationsMode.SendToAllAndSaveCopy);
}
catch (Exception ex)
{
    //
}

[更新]
有趣的是,如果我在上面的代码中评论RequiredAttendees约会属性,一切似乎都很好,但没有通知电子邮件发送给现有与会者。

[更新] 这仅适用于使用iCal创建的约会

[更新]

请求Xml:

POST https://acmemail.com/EWS/Exchange.asmx HTTP/1.1
Content-Type: text/xml; charset=utf-8
Accept: text/xml
User-Agent: ExchangeServicesClient/14.02.0051.000
Accept-Encoding: gzip,deflate
Host: acmemail.com
Cookie: exchangecookie=7d09b9f23afd4604bd17e3aa58aa8417
Content-Length: 2410
Expect: 100-continue
<?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="Exchange2010_SP1" />
    <t:ExchangeImpersonation>
      <t:ConnectingSID>
        <t:PrincipalName>ews_test_user</t:PrincipalName>
      </t:ConnectingSID>
    </t:ExchangeImpersonation>
  </soap:Header>
  <soap:Body>
    <m:UpdateItem ConflictResolution="AlwaysOverwrite" SendMeetingInvitationsOrCancellations="SendOnlyToAll">
      <m:ItemChanges>
        <t:ItemChange>
          <t:ItemId Id="AAMkADJiMGQ4ZWFkLWE0ODYtNDEyMC1hYWZjLTQ1ZGMyZDIzM2VjNwBGAAAAAAD9u1KcpHbwQZAL98T9qOWmBwCvOn1fMRuFRKKSfl9h8ZjeAAAAoz9XAABZjjBc5hT0S7NHrduyqC0sAAUlvIcSAAA=" ChangeKey="DwAAABYAAABkzlk3d4yMS7uVVX+i+BnJAAAABLU2" />
          <t:Updates>
            <t:SetItemField>
              <t:FieldURI FieldURI="item:Body" />
              <t:CalendarItem>
                <t:Body BodyType="HTML">TEST 3</t:Body>
              </t:CalendarItem>
            </t:SetItemField>
            <t:SetItemField>
              <t:FieldURI FieldURI="calendar:RequiredAttendees" />
              <t:CalendarItem>
                <t:RequiredAttendees>
                  <t:Attendee>
                    <t:Mailbox>
                      <t:Name>Tin.Tin</t:Name>
                      <t:EmailAddress>Tin.Tin@acmegroup.com</t:EmailAddress>
                      <t:RoutingType>SMTP</t:RoutingType>
                      <t:MailboxType>Mailbox</t:MailboxType>
                    </t:Mailbox>
                  </t:Attendee>
                  <t:Attendee>
                    <t:Mailbox>
                      <t:Name>Tin.Tin</t:Name>
                      <t:EmailAddress>Tin.Tin@acmegroup.com</t:EmailAddress>
                      <t:RoutingType>SMTP</t:RoutingType>
                      <t:MailboxType>OneOff</t:MailboxType>
                    </t:Mailbox>
                  </t:Attendee>
                </t:RequiredAttendees>
              </t:CalendarItem>
            </t:SetItemField>
          </t:Updates>
        </t:ItemChange>
      </m:ItemChanges>
    </m:UpdateItem>
  </soap:Body>
</soap:Envelope>

响应Xml:

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header>
        <h:ServerVersionInfo MajorVersion="14" MinorVersion="1" MajorBuildNumber="355" MinorBuildNumber="2" Version="Exchange2010_SP1" xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"/>
    </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> 

1 个答案:

答案 0 :(得分:7)

如果您想修改PropertySet,则需要将AppointmentSchema.RequiredAttendees添加到RequiredAttendees.Add PropertySet正在设置约会架构属性)。您无法修改appointment.Load(new PropertySet(BasePropertySet.IdOnly, AppointmentSchema.Start, AppointmentSchema.ReminderDueBy, AppointmentSchema.End, AppointmentSchema.StartTimeZone, AppointmentSchema.EndTimeZone, AppointmentSchema.TimeZone, AppointmentSchema.RequiredAttendees)); 中未包含的属性。

AppointmentState

在审核了您的响应XML后,似乎此问题与calendar:RequiredAttendees有关。请参阅this MSDN post以供参考。响应XML会告诉您无法更新的字段({{1}})。