2012-04-02 13 views
20

Ich versuche, einen vorhandenen Termin zu aktualisieren, aber EWS wirft "Set action is invalid for property.". Ich habe alle Werte überprüft, die für das Terminobjekt festgelegt wurden, aber ich kann die Ursache für diesen Fehler nicht ermitteln.EWS: Set-Aktion ist ungültig für Eigenschaft beim Aktualisieren von RequiredAttendees eines Termins

Hier ist mein Code-Schnipsel:

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, "[email protected]"); 

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("[email protected]"); 

    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) 
{ 
    // 
} 

[UPDATE]
Interessanter wenn ich RequiredAttendees Eigenschaft Termin in obigem Code kommentieren, alles scheint in Ordnung, aber keine Benachrichtigung E-Mail an bestehenden Teilnehmer versenden.

[UPDATE] Diese nur für Termine geschieht, die mit iCal

erstellt werden

[UPDATE]

XML-Anforderung:

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>[email protected]</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>[email protected]</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-Antwort:

<?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

Firoz, haben Sie eine Lösung gefunden? Ich habe das gleiche Problem und die Antwort von SilverNinja hilft nicht. – MikhailSP

+0

Alter Post aber vielleicht noch jemand lf Antwort: Nur der Organisator eines Meetings kann seine Werte aktualisieren, daher müssen Sie sich in diesem Fall nach Möglichkeit zum Organisator ausgeben. – YvesR

Antwort

7

Sie müssen AppointmentSchema.RequiredAttendees zu Ihrem PropertySet hinzufügen, wenn Sie es ändern möchten (RequiredAttendees.Add setzt die Ernennung Schema Eigenschaft). Sie können eine Eigenschaft, die nicht in Ihrem PropertySet enthalten ist, nicht ändern.

appointment.Load(new PropertySet(BasePropertySet.IdOnly, AppointmentSchema.Start, AppointmentSchema.ReminderDueBy, AppointmentSchema.End, AppointmentSchema.StartTimeZone, AppointmentSchema.EndTimeZone, AppointmentSchema.TimeZone, AppointmentSchema.RequiredAttendees)); 

Nach Ihrer Antwort XML Überprüfung - es scheint, dieses Problem mit dem AppointmentState zusammenhängt. Siehe this MSDN post als Referenz. Die Antwort-XML teilt Ihnen das Feld mit, das nicht aktualisiert werden kann (calendar:RequiredAttendees).

+0

Ich habe AppointmentSchema.RequiredAttendees zu meinem PropertySet hinzugefügt, wie Sie vorgeschlagen haben, aber immer noch denselben Fehler. Ist es möglich zu wissen, welche Eigenschaft dieses Problem verursacht? "Set-Aktion ist ungültig für Eigenschaft" ist eine sehr allgemeine Fehlermeldung. –

+0

Ich schätze Ihre Hilfe SliverNinja. Ich bin etwas neu mit EWS API. Können Sie mir helfen, Änderungen in meinem Code vorzunehmen, um dieses Problem zu beheben? –

+0

Sie haben Recht. AppointmentState ist 3 (was bedeutet, dass es sich um einen Meeting-Teilnehmer handelt). AppointmentState sollte 1 für Besprechungsbesitzer sein. Ich bin mir nicht sicher, wie die AppointmentState-Eigenschaft festgelegt wird, da sie nur für das Terminobjekt readonly ist. Ich fühle mich, als wäre ich irgendwo in der Nähe der Lösung. –