Производительность EWS в приложении C # WinForms - PullRequest
0 голосов
/ 29 января 2019

Я использую EWS в своем приложении winforms, чтобы создать новую встречу в моем Outlook (+, чтобы получить элементы из моего календаря Outlook).

Проблема, с которой я столкнулся, заключается в следующем:

Все работает идеально, но в настоящее время требуется 20-25 секунд, чтобы получить мои встречи (= элементы календаря в Outlook), и 13-20 секунд, чтобысоздать встречу

Код, который делает это прямо из Google:

 private void btn_Test_Click(object sender, EventArgs e)
        {
            DateTime d1 = DateTime.Now;
            ServicePointManager.ServerCertificateValidationCallback = CertificateValidationCallBack;
            try
            {
            service = new ExchangeService(ExchangeVersion.Exchange2013);
                service.Credentials = new WebCredentials("mail", "pass");
                /*service.TraceEnabled = true;
                service.TraceFlags = TraceFlags.All;*/
                service.AutodiscoverUrl("mail", RedirectionUrlValidationCallback);
                service.Url = new Uri("https://mail.domain.com/EWS/Exchange.asmx");
            }
            catch (Exception ml2)
            {
                MessageBox.Show(ml2.ToString());
            }

        // We get 10 items in the calendar for the next week
            DateTime startDate = DateTime.Now;
            DateTime endDate = startDate.AddDays(7);
            const int NUM_APPTS = 10;
            // Initialize the calendar folder object with only the folder ID. 
            CalendarFolder calendar = CalendarFolder.Bind(service, WellKnownFolderName.Calendar, new PropertySet());
            // Set the start and end time and number of appointments to retrieve.
            CalendarView cView = new CalendarView(startDate, endDate, NUM_APPTS);
            // Limit the properties returned to the appointment's subject, start time, and end time.
            cView.PropertySet = new PropertySet(AppointmentSchema.Subject, AppointmentSchema.Start, AppointmentSchema.End);
            // Retrieve a collection of appointments by using the calendar view.
            FindItemsResults<Appointment> appointments = calendar.FindAppointments(cView);
            Console.WriteLine("\nThe first " + NUM_APPTS + " appointments on your calendar from " + startDate.Date.ToShortDateString() +
                              " to " + endDate.Date.ToShortDateString() + " are: \n");

            foreach (Appointment a in appointments)
            {
                Console.Write("Subject: " + a.Subject.ToString() + " ");
                Console.Write("Start: " + a.Start.ToString() + " ");
                Console.Write("End: " + a.End.ToString());
                Console.WriteLine();
            }

       DateTime d2 = DateTime.Now;
           MessageBox.Show( "Seconds: " + (d2 - d1).TotalSeconds.ToString());
        }

Поскольку у меня абсолютно 0 опыта работы с EWS (или разработки с использованием API), мне было интересно, есть либыло место для выступления или я хотел знать, нормально ли это?Я не нашел ничего связанного с EWS = SLOW, поэтому немного волновался

Может ли быть так, что мой код неверен или мне нужно настроить тот или иной сервер на стороне для улучшения результатов?

Спасибо

1 Ответ

0 голосов
/ 30 января 2019

Наиболее вероятная вещь, которая может замедлить ваш код:

            service.AutodiscoverUrl("mail", RedirectionUrlValidationCallback);
            service.Url = new Uri("https://mail.domain.com/EWS/Exchange.asmx");

Вы делаете автообнаружение, а затем устанавливаете ссылку вручную, что делает первый вызов автообнаружения избыточным.Автоматическое обнаружение выполнит многократный поиск в локальном домене AD, DNS-записях, чтобы попытаться найти правильный URL-адрес для использования, поэтому я бы посоветовал, если вы собираетесь жестко закодировать URL-адрес, отмеченный в первой строке.

Также вашлогика тестирования смотрит только на общее время выполнения вашей функции, которое не будет полезным, вы должны смотреть на время для завершения каждой операции, например

FindItemsResults<Appointment> appointments = calendar.FindAppointments(cView);

или

CalendarFolder calendar = CalendarFolder.Bind(service, WellKnownFolderName.Calendar, new PropertySet());

или любой вызов метода типа «Сохранить, отправить» при фактическом вызове на сервер, если вы рассчитываете это, что даст вам истинное указание скорости каждого вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...