0

所以我有一个非常奇怪的问题。

我正在 .NET 2.0 下的 VB.Net 中编写一些与 MS Exchange 2003 接口的代码。由于 Exchange 2003 的“要求”,我被迫使用 WEBDAV 编写此代码。

代码本身在某种程度上复制了日程管理过程。它在 Exchange Server 上创建约会以响应用户的输入,并在 SQL Server 数据库中内部管理其数据。问题情况是这样的:分配了一个新人来负责一个会议。该要求说,程序应该向从会议中删除的人(如果存在这样的人)生成会议取消请求,并将会议请求发送给新人。

在存在现有人的情况下,似乎会发生以下情况:

  1. 会议取消请求已发送
  2. 在将会议请求发送给新人的请求集期间,交换 barfs 并返回状态代码 500(内部服务器错误)。

然而!在调试这个特定场景时,如果我在 Visual Studio 调试器中单步调试代码,它对我来说效果很好。留给它自己的设备,它每次都失败。

只是为了 yuk 的缘故,我Thread.Sleep(500)在发送取消请求后在该部分添加了一个,并且 Exchange 不再呕吐了......

所以,我的问题!

如果Thread.Sleep在代码中添加 a 会导致此错误消失,则意味着竞争条件,不是吗?但是,我的代码在 Web 应用程序下运行,并且从头到尾都是一个完全单线程的进程。我发送的网络请求都处于同步模式,所以这应该不是问题。

接下来我会做什么来尝试追踪问题?

  • 如果竞争条件本身在 .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 交互。

4

1 回答 1

0

最终坚持使用睡眠并收工。

我的“信念”是我错误地认为通过 WebDav 发送到 Exchange 的 WebRequest/WebResponse 组合是原子操作。

于 2010-10-13T02:17:12.890 回答