WebDAV & Exchange 2003 - работает в режиме отладки, не работает без - PullRequest
0 голосов
/ 24 сентября 2010

Итак, у меня очень странная проблема.

Я пишу некоторый код в VB.Net под .NET 2.0, который взаимодействует с MS Exchange 2003. Из-за «требования» Exchange 2003 я вынужден писать этот код с использованием WEBDAV.

Сам код в некоторой степени копирует процесс управления расписанием. Он создает встречи на сервере Exchange в ответ на входные данные пользователя и управляет своими данными внутри базы данных SQL Server. Проблемная ситуация такова: назначен ответственным за собрание новым человеком. В требовании говорится, что программа должна генерировать запрос на отмену собрания для лица, удаленного с собрания (если такой человек существовал), и запрос на собрание, отправляемый новому человеку.

В случае существующего человека, кажется, происходит следующее:

  1. Запрос на отмену встречи получает
  2. Обменивает barfs и возвращает код состояния 500 (внутренняя ошибка сервера) во время набора запросы, которые отправляют приглашение на собрание новому человеку.

Тем не менее! Во время отладки этого конкретного сценария он прекрасно работает, если я перебираю код в отладчике Visual Studio. Оставленный на его собственные устройства, он каждый раз выходит из строя.

Просто ради Юка, я добавил Thread.Sleep(500) к детали после отправки запроса на отмену, и Exchange больше не раздражает ...

Итак, мой вопрос!

Если добавление Thread.Sleep к коду приводит к исчезновению этой ошибки, подразумевается состояние гонки, нет? Но мой код выполняется в веб-приложении и представляет собой полностью однопоточный процесс от начала до конца. Все веб-запросы, которые я отправляю, находятся в синхронном режиме, поэтому это не должно быть проблемой.

Что мне делать дальше, чтобы попытаться отследить проблему?

  • Попробуй и угадай, если само условие гонки в сетевом коде .Net 2.0 BCL?
  • Попробуйте выполнить отладку на самом сервере Exchange?
  • Проигнорируйте это, будьте рады, что Thread.Sleep маскирует проблему и продолжает идти?

Любые дальнейшие предложения будут замечательными.


В ответ на комментарий я могу опубликовать ошибочную функцию:

    Private Shared Sub UpdateMeeting(ByVal folder As String, ByVal meetingId As String, ByVal oldAssignedId As String, ByVal newAssignedTo As String, ByVal transaction As DbTransaction)
        If String.IsNullOrEmpty(meetingId) Then
            Throw New Exception("Outlook ID for that date and time is empty.")
        End If
        Dim x As New Collections.Generic.List(Of String)
        If oldAssignedId <> newAssignedTo AndAlso Not String.IsNullOrEmpty(oldAssignedId) Then
            'send cancellation to old person
            Dim lGetCounselorEmail1 As String = GetCounselorEmail(oldAssignedId, transaction)
            Common.Exchange.SendCancellation(meetingId, New String() {lGetCounselorEmail1})
            ' Something very weird here. Running this code through the debugger works fine. Running without causes exchange to return 500 - Internal Server Error.
            Threading.Thread.Sleep(500)
        End If
        x.Add(folder)
        If Not String.IsNullOrEmpty(newAssignedTo) Then x.Add(GetCounselorEmail(newAssignedTo, transaction))
        x.RemoveAll(AddressOf String.IsNullOrEmpty)
        If x.Count > 0 Then
            If Not Common.Exchange.UpdateMeetingAttendees(meetingId, x.ToArray()) Then
                Throw New Exception("Failure during update of calendar")
            End If
        End If
    End Sub

... но многие детали реализации скрыты здесь, так как я написал набор классов для взаимодействия с Exchange WebDAV.

1 Ответ

0 голосов
/ 13 октября 2010

Закончилось придерживаться сна и называть это днем.

Мое «убеждение» состоит в том, что я ошибочно полагал, что комбо WebRequest / WebResponse, отправленное в Exchange через WebDav, было атомарной операцией.

...