ErrorIrresolvableConflict при создании события

Я получаю много ошибок, связанных с кодом ответа ErrorIrresolvableConflict, при попытке создать событие

Stack Trace -    at Microsoft.OData.ProxyExtensions.DataServiceContextWrapper.<SaveChangesAsync>d__5e.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Office365CalendarProviderBL.<>c__DisplayClass7_0.<<CreateCalendarEvent>b__0>d.MoveNext() - Inner Exception - Microsoft.OData.Client.DataServiceRequestException: An error occurred while processing this request. ---> Microsoft.OData.Client.DataServiceClientException: {"error":{"code":"ErrorIrresolvableConflict","message":"The send or update operation could not be performed because the change key passed in the request does not match the current change key for the item."}}
   --- End of inner exception stack trace ---
   at Microsoft.OData.Client.SaveResult.HandleResponse()
   at Microsoft.OData.Client.BaseSaveResult.EndRequest()
   at Microsoft.OData.Client.DataServiceContext.EndSaveChanges(IAsyncResult asyncResult)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.OData.ProxyExtensions.DataServiceContextWrapper.<SaveChangesAsync>d__5e.MoveNext()

Я получаю это сообщение с этим исключением. Операция отправки или обновления не может быть выполнена, потому что ключ изменения, переданный в запросе, не соответствует текущему ключу изменения для элемента.

  1. Объясните, пожалуйста, что такое ключ изменения и как он работает?
  2. Я получаю эти исключения только вчера и не менял код. Нужно ли мне что-то обновлять на моем конце или я что-то упускаю?

Я использую DLL V1 - https://api.office.com/discovery/v1.0/me/ Версия ProxyExtension - 23

Код:-

// In this method, we are populating event properties later used to create event on calendar. Please verify if I am missing any important property here
private Event CreateCalEventObj(CalendarMeetingBL meeting, string location, meetingAdditionalDataBL data)
{
    Event calEvent = new Event();
    try
    {
        calEvent.Subject = WEB.HttpUtility.HtmlDecode(meeting.MeetingName);
        calEvent.ShowAs = FreeBusyStatus.Busy;
        if (meeting.EventAlarmInMinutes == -1)
            meeting.EventAlarmInMinutes = null;
        calEvent.Reminder = meeting.EventAlarmInMinutes;
        calEvent.Start = meeting.StartTime;
        calEvent.End = meeting.EndTime;
        calEvent.StartTimeZone = meeting.TimeZoneString;
        calEvent.EndTimeZone = meeting.TimeZoneString;

        if (!string.IsNullOrEmpty(location) && location.Length <= 500)
        {
            calEvent.Location = new Microsoft.Office365.OutlookServices.Location()
            {
                DisplayName = CommonBL.FixLineBreakForGooglelocation(WEB.HttpUtility.HtmlDecode(location.Replace("\n", " ")))
            };
        }
        else if (!string.IsNullOrEmpty(data.Phone))
        {
            calEvent.Location = new Microsoft.Office365.OutlookServices.Location()
            {
                DisplayName = "Phone: " + CommonBL.FixLineBreakForGooglelocation(WEB.HttpUtility.HtmlDecode(data.Phone))
            };
        }
        else if (!string.IsNullOrEmpty(data.MobileNumber))
        {
            calEvent.Location = new Microsoft.Office365.OutlookServices.Location()
            {
                DisplayName = "Mobile: " + CommonBL.FixLineBreakForGooglelocation(WEB.HttpUtility.HtmlDecode(data.MobileNumber))
            };
        }
        calEvent.Body = new ItemBody()
        {
            Content = CommonBL.RevertLineBreakPlaceHolder((WEB.HttpUtility.HtmlDecode(meeting.MeetingDetails.Replace(@"\\\", "\\"))))
        };
    }
    catch (Exception ex)
    {
        BLFactory.CurrentInstance.LoggingBLObj.InsertLog("Insert logging here");
        calEvent = null;
    }
    return calEvent;
}

// In this method we are creating event on calendar.
private string CreateCalendarEvent(CalendarMeetingBL meeting, List<ParticipantBL> invitees, string username, string calendarId, OutlookServicesClient service, string location, meetingAdditionalDataBL data, string meetingId = "-1")
{
    var taskCreateMeeting = Task<string>.Run(
            async () =>
            {
                Event calEvent = CreateCalEventObj(meeting, location, data);
                if (calEvent != null)
                {
                    try
                    {
                        //Add invitees to the event
                        foreach (ParticipantBL inviteeItem in invitees)
                        {
                            if (!inviteeItem.IsAdditional)
                            {
                                calEvent.Attendees.Add(new Attendee()
                                {
                                    EmailAddress = new EmailAddress()
                                    {
                                        Address = inviteeItem.Email.Replace("&#39;", "'"),
                                        Name = inviteeItem.Name
                                    },
                                    Type = AttendeeType.Required,
                                    Status = new ResponseStatus()
                                    {
                                        Response = ResponseType.Accepted,
                                        Time = DateTime.Now
                                    }
                                });
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        BLFactory.CurrentInstance.LoggingBLObj.InsertLog(meeting.MeetingId, username, "Locally User ID is Meeting id AND email is username - Scheduling Logging Exception 3 - Stack Trace - " + ex.StackTrace + " - Inner Exception - " + ex.InnerException + " - meetingObjValues - " + meetingObjValues + " - meetingAdditionalDataObjValues - " + meetingAdditionalDataObjValues + " -  username - " + username + " - calendarId - " + calendarId + " - location - " + location + " - meetingId - " + meetingId, meeting.MeetingId);
                        return "-1";
                    }

                    try
                    {

                        var providerDefault = (String.IsNullOrEmpty(calendarId) ? service.Me.Events : service.Me.Calendars[calendarId].Events);
                        await providerDefault.AddEventAsync(calEvent);          // We are getting Exception here but Event is created in calendar                     
                        return calEvent.Id;                                     // Event object is not updated after exception
                    }
                    catch (Exception ex)
                    {
                        BLFactory.CurrentInstance.LoggingBLObj.InsertLog("Insert exception logging here");
                        return "-1";
                    }
                }
                else
                    return "-1";
            }
        );
    Task.WaitAll(taskCreateMeeting);
    string id = taskCreateMeeting.Result;
    return id;
}

Мы получаем исключение типа Microsoft.OData.Client.DataServiceRequestException, но оно не попадает в специальный блок catch.

                catch (Microsoft.OData.Client.DataServiceRequestException ex)
                {
                    BLFactory.CurrentInstance.LoggingBLObj.InsertLog("Insert logging here");
                    return "-1";
                }

Сообщите мне, если требуется что-то еще. Заранее спасибо.


person Harsh Vats    schedule 29.06.2016    source источник
comment
Значение calendarId в коде var providerDefault = (String.IsNullOrEmpty(calendarId) ? service.Me.Events : service.Me.Calendars[calendarId].Events); пустое или пустое? Я также предлагаю вам отслеживать подробные сведения об ошибке с помощью Fiddler, чтобы просмотреть подробные сведения об ошибке.   -  person Fei Xue - MSFT    schedule 08.07.2016
comment
Кажется, проблема решена. Взгляните здесь   -  person Dmitry Dolotovskikh    schedule 09.01.2020


Ответы (1)


Это не имеет прямого отношения к OData - мы видели то же самое с EWS. Мы только что нашли базовое условие гонки внутри кода Exchange, которое вызывало это, и один из наших разработчиков только что проверил исправление для этого. Таким образом, он должен скоро начать развертываться в производственной среде.

В вашем коде нет ничего плохого, что могло бы вызвать это для нового элемента.

person David Sterling - MSFT    schedule 02.02.2017
comment
Спасибо Дэвиду за обновление. Не могли бы вы изучить еще одну проблему? stackoverflow.com/questions/41478331 / Этот вопрос является для нас приоритетным. - person Harsh Vats; 06.02.2017
comment
Я только начал испытывать это, но с обновлениями категорий сообщений. Похоже, для нас это началось 17 марта 2017 года. - person Rexx Magnus; 20.03.2017
comment
Здравствуйте, Дэвид, не могли бы вы рассказать нам, в какой версии Exchange затрагивается эта ошибка и в какой версии она исправлена? Заранее спасибо. - person Pau; 27.04.2018
comment
Я не уверен, в какой сборке это было исправлено, но, безусловно, в этой точке она была развернута по всему миру. Сообщите мне, если вы все еще наблюдаете такое поведение. - person David Sterling - MSFT; 15.05.2018
comment
Привет @ DavidSterling-MSFT, мне интересно, наблюдается ли в настоящее время подобная проблема? Мы периодически получаем это ErrorIrresolvableConflict при создании событий с посетителями через Outlook REST api (v2.0). Началось 28 октября, и мы не можем получить подтверждения, если это известная проблема, кроме этой статьи, которая кажется косвенно связанной: support.office.com/en-us/article/ - person lior; 01.11.2019
comment
Я также наблюдаю такое поведение в моем приложении при создании событий с участниками, поэтому я предполагаю, что это означает, что состояние гонки, указанное в потоке, вернулось к жизни. - person Antonio Acevedo; 01.11.2019
comment
@lior, да, похоже, это та же проблема, связанная с предоставленной вами статьей. Он все еще там, мы пару раз в день получаем такие ошибки при вызове Graph API. Жаль, что об этом нигде не упоминается. Что еще хуже, иногда, когда мы получаем ошибку, событие в конечном итоге создается, но после ошибки мы повторяем попытку, что приводит к дублированию событий ... - person Krzysztof Wolny; 28.11.2019
comment
@ DavidSterling-MSFT Есть идеи, когда проблема будет решена? Он все еще существует и влияет на использование API. Упомянутые обходные пути для Outlook неприменимы при использовании API: support.microsoft.com/en-us/help/4502145/ - person Krzysztof Wolny; 28.11.2019