Так что у меня очень странная проблема.WebDAV & Exchange 2003 - работает в отладочном режиме, не работает
Я пишу код в VB.Net под .NET 2.0, который взаимодействует с MS Exchange 2003. Из-за требования «Exchange 2003» я вынужден написать этот код с помощью WEBDAV.
Сам код реплицирует, в некоторой степени, процесс управления расписанием. Он создает приложения на сервере Exchange в ответ на входные данные пользователя и управление его данными внутри базы данных SQL Server. Проблема заключается в следующем: новый человек назначается ответственным за встречу. В требовании указано, что программа должна сгенерировать запрос на отмену встречи лицу, удаленному от собрания (если такое лицо существует), и запрос на встречу, направленный новому лицу.
В случае там быть существующий человек, кажется, что произойдет это:
- Отмена встречи запрос отправляется
- Обмен barfs и возвращает код состояния 500 (внутренняя ошибка сервера) во время набор запросов, которые отправляют запрос на встречу новому лицу.
Однако! Отлаживая этот сценарий, он отлично подходит для меня, если я пройду через код в отладчике Visual Studio. Оставаясь на своих устройствах, он терпит неудачу каждый раз.
Просто ради Юк, я добавил Thread.Sleep(500)
к части после отправки запроса на отмену, и обмен не блевать больше ...
Итак, мой вопрос!
Если добавление 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.
Было бы полезно увидеть несколько строк кода до и после 'Sleep'. –