编程语言
首页 > 编程语言> > c# – 如何在Update()上设置Microsoft.Exchange.WebServices.Data.Appointment属性?

c# – 如何在Update()上设置Microsoft.Exchange.WebServices.Data.Appointment属性?

作者:互联网

问题

我有一个安装了Microsoft.Exchange.WebServices v2.2.0 NuGet包的Visual Studios 2015控制台应用程序.我正在尝试创建约会,更新它并取消它,同时在日历邀请主体中自动生成的“When”字符串中保留正确的时区.目前,初始创建具有正确的时区,但任何后续更新都会导致时区恢复为UTC.

注意:我们有Exchange 2010服务器并使用Outlook 2013客户端.

代码示例

using System;
using System.Globalization;
using Microsoft.Exchange.WebServices.Data;

namespace EWSTesting
{
    class Program
    {
        private const string EmailServer = ""; //replace with your Exchange server
        private const string EmailAddress = ""; //replace with your email

        static void Main(string[] args)
        {
            Console.WriteLine("Current Timezone: " + TimeZoneInfo.Local.DisplayName);

            var exchangeService = new ExchangeService(ExchangeVersion.Exchange2010, TimeZoneInfo.Local)
            {
                PreferredCulture = new CultureInfo("en-US"),
                Url = new Uri(EmailServer),
                UseDefaultCredentials = true
            };

            Console.WriteLine("exchangeService.TimeZone.DisplayName: " + exchangeService.TimeZone.DisplayName);

            var startDate = DateTime.Today;
            var endDate = startDate.AddHours(1);

            //Create initial appointment
            var appointment = new Appointment(exchangeService)
            {
                Subject = "Testing Appointments",
                Body = "Testing Appointments Body",
                Location = "Test Location",
                LegacyFreeBusyStatus = LegacyFreeBusyStatus.Busy,
                Sensitivity = Sensitivity.Private,
                Start = startDate,
                End = endDate
            };
            appointment.OptionalAttendees.Add(EmailAddress);
            appointment.Save(SendInvitationsMode.SendOnlyToAll);

            Console.WriteLine("exchangeService.TimeZone.DisplayName: " + exchangeService.TimeZone.DisplayName);

            var appointmentId = appointment.Id;

            Console.WriteLine("Pause to check inbox 'When' value on invite");
            Console.ReadLine();

            appointment = Appointment.Bind(exchangeService, appointmentId);

            appointment.Load(new PropertySet(PropertySet.FirstClassProperties)
            {
                AppointmentSchema.StartTimeZone,
                AppointmentSchema.EndTimeZone,
                AppointmentSchema.TimeZone
            });

            appointment.Body = "Body Updated Successfully";
            appointment.Update(ConflictResolutionMode.AlwaysOverwrite, SendInvitationsOrCancellationsMode.SendOnlyToAll);

            Console.WriteLine("exchangeService.TimeZone.DisplayName: " + exchangeService.TimeZone.DisplayName);
            Console.WriteLine("appointment.StartTimeZone.DisplayName: " + appointment.StartTimeZone.DisplayName);
            Console.WriteLine("appointment.EndTimeZone.DisplayName: " + appointment.EndTimeZone.DisplayName);
            Console.WriteLine("appointment.TimeZone: " + appointment.TimeZone);

            Console.WriteLine();
            Console.WriteLine("Pause to check updated inbox 'When' value on invite");
            Console.ReadLine();

            appointment = Appointment.Bind(exchangeService, appointmentId);

            appointment.Load(new PropertySet(PropertySet.FirstClassProperties)
            {
                AppointmentSchema.StartTimeZone,
                AppointmentSchema.EndTimeZone,
                AppointmentSchema.TimeZone
            });

            Console.WriteLine("exchangeService.TimeZone.DisplayName: " + exchangeService.TimeZone.DisplayName);
            Console.WriteLine("appointment.StartTimeZone.DisplayName: " + appointment.StartTimeZone.DisplayName);
            Console.WriteLine("appointment.EndTimeZone.DisplayName: " + appointment.EndTimeZone.DisplayName);
            Console.WriteLine("appointment.TimeZone: " + appointment.TimeZone);

            appointment.CancelMeeting();

            Console.WriteLine("Appointment Deleted");
            Console.ReadLine();
        }
    }
}

以上代码的结果

初始邀请(正确的时区)

更新约会(正文中的时区不正确)

预约取消(正文中的时区不正确)

控制台提供的代码结果

我正在寻找什么

我不需要将附加的“When”(在上面的图片中以红色加下划线)附加到邀请的正文中.要么我想完全删除它(首选),或者我想在任何更新中更正它.

解决方法:

似乎问题是EWS 2.2.0 DLL中的错误,时区SOAP标头未添加到Update()和CancelMeeting()Exchange事务中.下面的代码通过手动附加正确的标头来解决此问题.

对于Update():

exchangeService.OnSerializeCustomSoapHeaders += service_OnSerializeCustomSoapHeaders;
appointment.Update(ConflictResolutionMode.AlwaysOverwrite, SendInvitationsOrCancellationsMode.SendOnlyToAll);
exchangeService.OnSerializeCustomSoapHeaders -= service_OnSerializeCustomSoapHeaders;

对于CancelMeeting():

exchangeService.OnSerializeCustomSoapHeaders += service_OnSerializeCustomSoapHeaders;
appointment.CancelMeeting();
exchangeService.OnSerializeCustomSoapHeaders -= service_OnSerializeCustomSoapHeaders;

活动实施:

static void service_OnSerializeCustomSoapHeaders(XmlWriter writer)
{
    writer.WriteRaw(Environment.NewLine + "    <t:TimeZoneContext><t:TimeZoneDefinition Id=\"" + TimeZoneInfo.Local.StandardName + "\"/></t:TimeZoneContext>" + Environment.NewLine);
}

标签:c,exchangewebservices,exchange-server-2010,outlook-2013
来源: https://codeday.me/bug/20190627/1308748.html