WebDAV & Exchange 2003 - работает в режиме отладки, не работает без

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

Я пишу некоторый код в 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 ответ

Решение

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

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

Другие вопросы по тегам