Vb.net WebDAV&;Exchange 2003-在调试中工作,在没有

Vb.net WebDAV&;Exchange 2003-在调试中工作,在没有,vb.net,debugging,webdav,race-condition,exchange-server-2003,Vb.net,Debugging,Webdav,Race Condition,Exchange Server 2003,所以我有一个很奇怪的问题 我正在用VB.Net在.NET2.0下编写一些与MSExchange2003接口的代码。由于Exchange2003的“要求”,我不得不使用WEBDAV编写此代码 代码本身在某种程度上复制了一个进度管理过程。它在Exchange服务器上创建约会以响应用户的输入,并在SQL Server数据库中内部管理其数据。 问题是这样的:一个新的人被指派负责一个会议。该要求指出,该程序应向被取消会议的人员(如果该人员存在)生成会议取消请求,并向新人员发送会议请求 在现有人员的情况下,

所以我有一个很奇怪的问题

我正在用VB.Net在.NET2.0下编写一些与MSExchange2003接口的代码。由于Exchange2003的“要求”,我不得不使用WEBDAV编写此代码

代码本身在某种程度上复制了一个进度管理过程。它在Exchange服务器上创建约会以响应用户的输入,并在SQL Server数据库中内部管理其数据。 问题是这样的:一个新的人被指派负责一个会议。该要求指出,该程序应向被取消会议的人员(如果该人员存在)生成会议取消请求,并向新人员发送会议请求

在现有人员的情况下,似乎发生了以下情况:

  • 取消会议的请求 被发送
  • 在设置期间,Exchange会发出BARF并返回状态代码500(内部服务器错误) 将会议请求发送给新人的请求
  • 然而!在调试这个特定场景时,如果我在VisualStudio调试器中单步执行代码,它对我来说就可以正常工作。如果让它自己使用,它每次都会失败

    为了yuk的缘故,在发送取消请求后,我在部件中添加了一个
    线程.Sleep(500)
    ,Exchange不再呕吐

    所以,我的问题

    如果向代码中添加
    Thread.Sleep
    导致此错误消失,则暗示存在竞争条件,否?但是,我的代码是在web应用程序下运行的,从头到尾都是一个完全单线程的过程。我发送的web请求都处于同步模式,所以这应该不是问题

    我下一步会做什么来追踪这个问题

    • 如果竞赛条件本身在.NET2.0BCL网络代码中,请尝试判断
    • 是否尝试在Exchange服务器本身上进行一些调试
    • 忽略它,很高兴
      线程。睡眠
      掩盖了问题并继续
    任何进一步的建议都很好


    作为对评论的回应,我可以发布失败的函数:

        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
    
    Private Shared Sub UpdateMeeting(ByVal folder作为字符串,ByVal meetingId作为字符串,ByVal oldsassignedid作为字符串,ByVal newAssignedTo作为字符串,ByVal transaction作为DbTransaction)
    如果String.IsNullOrEmpty(meetingId),则
    抛出新异常(“该日期和时间的Outlook ID为空。”)
    如果结束
    Dim x作为新集合.Generic.List(字符串)
    如果oldAssignedId newAssignedTo和Also Not String.IsNullOrEmpty(oldAssignedId),则
    '将取消发送给老人
    Dim LGetConsultureEmail1作为字符串=GetConsultureEmail(oldAssignedId,事务)
    Common.Exchange.SendCancellation(meetingId,新字符串(){lgetConsultureEmail1})
    “这里有点奇怪。通过调试器运行此代码可以正常工作。不运行会导致exchange返回500-内部服务器错误。
    线程。线程。睡眠(500)
    如果结束
    x、 添加(文件夹)
    如果不是String.IsNullOrEmpty(newAssignedTo),那么x.Add(getConsultureEmail(newAssignedTo,事务))
    x、 RemoveAll(AddressOf String.IsNullOrEmpty)
    如果x.计数>0,则
    如果不是通用的.Exchange.UpdateMeetingAttendees(meetingId,x.ToArray()),则
    抛出新异常(“日历更新期间失败”)
    如果结束
    如果结束
    端接头
    

    …但这里隐藏了许多实现细节,因为我编写了一组类来与Exchange WebDAV进行接口。

    最后坚持使用睡眠并结束了一天的工作


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

    睡眠之前和之后查看少量代码行将非常有用。