Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EWS保存每个日历约会的Guid_C#_Guid_Exchangewebservices_Exchange Server 2010 - Fatal编程技术网

C# EWS保存每个日历约会的Guid

C# EWS保存每个日历约会的Guid,c#,guid,exchangewebservices,exchange-server-2010,C#,Guid,Exchangewebservices,Exchange Server 2010,我需要为每个约会保存一个Guid。 我曾尝试使用PolicyTag和ArchiveTag,但得到了一个 “属性PolicyTag仅对Exchange 2013或 以后的版本。” 例外 我们是否为Exchange 2010提供了类似的服务? 据我所知,有一个appointment.ID包含自己生成的ID。 我宁愿不使用它。 谢谢。解决此问题的一种方法是创建一个扩展属性,并为约会放置guid,除非您从另一个约会复制了一个副本,否则它不会更改(毕竟它只是一个属性) 此解决方案在单一预约和使用本地Exc

我需要为每个约会保存一个Guid。 我曾尝试使用
PolicyTag
ArchiveTag
,但得到了一个

“属性PolicyTag仅对Exchange 2013或 以后的版本。”

例外

我们是否为Exchange 2010提供了类似的服务? 据我所知,有一个
appointment.ID
包含自己生成的ID。 我宁愿不使用它。
谢谢。

解决此问题的一种方法是创建一个扩展属性,并为约会放置guid,除非您从另一个约会复制了一个副本,否则它不会更改(毕竟它只是一个属性)

此解决方案在单一预约和使用本地Exchange的情况下都非常有效。这里的问题是,对于在线Web访问(OWA)中的会议,例如Office 365,约会的属性是从组织者的原始约会复制而来的,这些属性中包括扩展属性,其中包括AppointId。 因此,为了避免此问题,我们将与会者的约会id设置为与organizer中的原始id相似,只需添加服务所有者(生成通知的服务)的电子邮件地址。 如果没有此解决方案,内部系统中的约会将具有与原始预订类似的AppointmentID,并且将被视为一个约会,或者您可能有两个具有相同ID的不同约会

 private static void SetGuidForMeetingAppiontment(Appointment appointment)
        {
            var log = "";

            try
            {
                if (!appointment.IsMeeting) return;
                if (appointment.Service.ImpersonatedUserId == null) return;

                /*
                 * The only tricky case is that if the appointment is created at the attendee with no Guid.
                 * In this case the application should look for the original appointment from the organizer's side, and get its guid, to paste it in the new booking 
                 * from the attendee side, and add the attendee emailAddress. 
                 */
                if (GetGuidForMeetingAppointement(appointment).Length <= 36)
                {
                    // If it was an attendee, then look for the original appointment from the organizer's service
                    if (appointment.Service.ImpersonatedUserId.Id != appointment.Organizer.Address)
                    {

                        log += "1/5 Getting the original event of the meeting\n";
                        if (ExchangeLiteService.Services.ContainsKey(appointment.Organizer.Address))
                        {
                            //  FindItemsResults<Appointment> originalAppointments;
                            var originalAppointments = ExchangeLiteService.Services[appointment.Organizer.Address].FindAppointments(WellKnownFolderName.Calendar, new CalendarView(appointment.Start, appointment.End, 1));
                            if (originalAppointments == null) return; //there must be an original appointment. 
                            if (!originalAppointments.Any()) return; //there must be an original appointment. 
                            var originalAppointment = originalAppointments.First(); // there should be only one appointment at a specifict time and date. 

                            log += "2/5 Getting the Guid for the original event of the meeting\n";
                            var originalAppointmentID = GetGuidForMeetingAppointement(originalAppointment);
                            if (string.IsNullOrEmpty(originalAppointmentID)) return; // the original appointment must have a guid already.

                            var orignalAppointmentIDGuid = originalAppointmentID.Substring(0, 36);

                            log += "3/5 Attaching the email address to the guid extracted\n";
                            var newAppointmentID = orignalAppointmentIDGuid + "_" + appointment.Service.ImpersonatedUserId.Id;

                            log += "4/5 Setting the new Guid to the meeting appointment\n";
                            appointment.SetExtendedProperty((ExtendedPropertyDefinition)AppointementIdPropertyDefinition, newAppointmentID);

                            log += "5/5 Updateing the meeting appointment\n";
                            appointment.Update(ConflictResolutionMode.AlwaysOverwrite, SendInvitationsOrCancellationsMode.SendToNone);
                        }
                        else //Then the user is invited from an organizer outside the system.
                        {
                            // Delete if there are anything similar 
                            ExchangeLiteService.OnCallDeleteBookingFromInternal(appointment.Service.ImpersonatedUserId.Id, appointment.Start, appointment.End);

                            //Assign a new 
                            var appointmentIDGuid = Guid.NewGuid().ToString();
                            var newAppointmentID = appointmentIDGuid + "_" + appointment.Service.ImpersonatedUserId.Id;
                            appointment.SetExtendedProperty((ExtendedPropertyDefinition)AppointementIdPropertyDefinition, newAppointmentID);
                            appointment.Update(ConflictResolutionMode.AlwaysOverwrite, SendInvitationsOrCancellationsMode.SendToNone);

                        }
                        //Get only the guid part of it (without the address of the organizer) 
                    }
                    else // if he was the organizer 
                    {
                        log += "If it was new meeting appointment and the notification from the organizer\n";
                        var appointmentIDGuid = Guid.NewGuid().ToString();
                        var newAppointmentID = appointmentIDGuid + "_" + appointment.Service.ImpersonatedUserId.Id;
                        appointment.SetExtendedProperty((ExtendedPropertyDefinition)AppointementIdPropertyDefinition, newAppointmentID);
                        appointment.Update(ConflictResolutionMode.AlwaysOverwrite, SendInvitationsOrCancellationsMode.SendToNone);
                    }
                }
                else
                {
                    log += "If it was an updated meeting appointment and has Guid already\n";
                    var appointmentID = GetGuidForMeetingAppointement(appointment);
                    var appointmentIDGuid = appointmentID.Substring(0, 36);
                    var newAppointmentID = appointmentIDGuid + "_" + appointment.Service.ImpersonatedUserId.Id;
                    appointment.SetExtendedProperty((ExtendedPropertyDefinition)AppointementIdPropertyDefinition, newAppointmentID);
                    appointment.Update(ConflictResolutionMode.AlwaysOverwrite, SendInvitationsOrCancellationsMode.SendToNone);
                }
            }
            catch (Exception ex)
            {
                //Logging the exception
            }

        }
private static void setguidformetingappionment(约会)
{
var log=“”;
尝试
{
如果(!appoint.IsMeeting)返回;
if(appointment.Service.ImpersonatedUserId==null)返回;
/*
*唯一棘手的情况是,如果约会是在没有Guid的与会者处创建的。
*在这种情况下,应用程序应该从组织者一侧查找原始约会,并获取其guid,以将其粘贴到新预订中
*从与会者一侧,添加与会者电子邮件地址。
*/

if(GetGuidFormetingAppoint(预约).Length谢谢你的代码。我试过了,效果很好。这是否意味着我不能使用约会唯一id来更新、取消约会,因为它会在一段时间后更改?我可以使用此GUID绑定到会议,然后更新、取消它吗?关于唯一id,是的,你可以使用它,但很难跟踪它如果约会被移动到另一个文件夹,例如,如果它被删除,尽管您收到的通知来自同一个约会,但UniqueID将发生变化,因此如果您将UniqueID映射为主键,那么在会议中,同一个约会将有两行,这是不同且棘手的部分Organizer创建会议并将其发送给与会者,实际上它会将同一约会对象的副本发送给与会者。一旦创建了约会,扩展属性(“AppointmentID”)当然将为空,然后将发送给与会者。在这种情况下(在新创建的情况下)这没关系,因为与会者会将约会视为新的约会并放置自己的GUID。但是!一旦组织者更改会议,它将覆盖其余的所有属性,包括我们的“AppointmentID”!!!在OWA(在线Web访问)的情况下,此问题发生在我身上例如,如果您使用的是office 365。我在outlook的“内部部署”版本中没有遇到此问题(我不知道为什么)。无论如何,如果您希望我帮助您解决此问题,请在遇到问题后发表新帖子,我将与您分享我使用的解决方案。这样,更多人可以受益,我可以获得更多分数;)在这里,我使用Guid在exchange约会和内部数据库或内部日历中的约会之间进行映射。但您可以始终使用唯一ID将通知绑定到约会。我在这里的解决方案解决了那些希望将exchange约会与系统中约会同步的人的问题。我已更新了我的回答上面的问题并添加代码。现在这是我这边的解决方案,根据我们的需要,它可能与您需要的方式或您解决它的方式不同。但是看一看,试着理解这个概念,我几乎在每行后面都放了许多注释。
 private static void SetGuidForMeetingAppiontment(Appointment appointment)
        {
            var log = "";

            try
            {
                if (!appointment.IsMeeting) return;
                if (appointment.Service.ImpersonatedUserId == null) return;

                /*
                 * The only tricky case is that if the appointment is created at the attendee with no Guid.
                 * In this case the application should look for the original appointment from the organizer's side, and get its guid, to paste it in the new booking 
                 * from the attendee side, and add the attendee emailAddress. 
                 */
                if (GetGuidForMeetingAppointement(appointment).Length <= 36)
                {
                    // If it was an attendee, then look for the original appointment from the organizer's service
                    if (appointment.Service.ImpersonatedUserId.Id != appointment.Organizer.Address)
                    {

                        log += "1/5 Getting the original event of the meeting\n";
                        if (ExchangeLiteService.Services.ContainsKey(appointment.Organizer.Address))
                        {
                            //  FindItemsResults<Appointment> originalAppointments;
                            var originalAppointments = ExchangeLiteService.Services[appointment.Organizer.Address].FindAppointments(WellKnownFolderName.Calendar, new CalendarView(appointment.Start, appointment.End, 1));
                            if (originalAppointments == null) return; //there must be an original appointment. 
                            if (!originalAppointments.Any()) return; //there must be an original appointment. 
                            var originalAppointment = originalAppointments.First(); // there should be only one appointment at a specifict time and date. 

                            log += "2/5 Getting the Guid for the original event of the meeting\n";
                            var originalAppointmentID = GetGuidForMeetingAppointement(originalAppointment);
                            if (string.IsNullOrEmpty(originalAppointmentID)) return; // the original appointment must have a guid already.

                            var orignalAppointmentIDGuid = originalAppointmentID.Substring(0, 36);

                            log += "3/5 Attaching the email address to the guid extracted\n";
                            var newAppointmentID = orignalAppointmentIDGuid + "_" + appointment.Service.ImpersonatedUserId.Id;

                            log += "4/5 Setting the new Guid to the meeting appointment\n";
                            appointment.SetExtendedProperty((ExtendedPropertyDefinition)AppointementIdPropertyDefinition, newAppointmentID);

                            log += "5/5 Updateing the meeting appointment\n";
                            appointment.Update(ConflictResolutionMode.AlwaysOverwrite, SendInvitationsOrCancellationsMode.SendToNone);
                        }
                        else //Then the user is invited from an organizer outside the system.
                        {
                            // Delete if there are anything similar 
                            ExchangeLiteService.OnCallDeleteBookingFromInternal(appointment.Service.ImpersonatedUserId.Id, appointment.Start, appointment.End);

                            //Assign a new 
                            var appointmentIDGuid = Guid.NewGuid().ToString();
                            var newAppointmentID = appointmentIDGuid + "_" + appointment.Service.ImpersonatedUserId.Id;
                            appointment.SetExtendedProperty((ExtendedPropertyDefinition)AppointementIdPropertyDefinition, newAppointmentID);
                            appointment.Update(ConflictResolutionMode.AlwaysOverwrite, SendInvitationsOrCancellationsMode.SendToNone);

                        }
                        //Get only the guid part of it (without the address of the organizer) 
                    }
                    else // if he was the organizer 
                    {
                        log += "If it was new meeting appointment and the notification from the organizer\n";
                        var appointmentIDGuid = Guid.NewGuid().ToString();
                        var newAppointmentID = appointmentIDGuid + "_" + appointment.Service.ImpersonatedUserId.Id;
                        appointment.SetExtendedProperty((ExtendedPropertyDefinition)AppointementIdPropertyDefinition, newAppointmentID);
                        appointment.Update(ConflictResolutionMode.AlwaysOverwrite, SendInvitationsOrCancellationsMode.SendToNone);
                    }
                }
                else
                {
                    log += "If it was an updated meeting appointment and has Guid already\n";
                    var appointmentID = GetGuidForMeetingAppointement(appointment);
                    var appointmentIDGuid = appointmentID.Substring(0, 36);
                    var newAppointmentID = appointmentIDGuid + "_" + appointment.Service.ImpersonatedUserId.Id;
                    appointment.SetExtendedProperty((ExtendedPropertyDefinition)AppointementIdPropertyDefinition, newAppointmentID);
                    appointment.Update(ConflictResolutionMode.AlwaysOverwrite, SendInvitationsOrCancellationsMode.SendToNone);
                }
            }
            catch (Exception ex)
            {
                //Logging the exception
            }

        }