Vb.net WebDAV&;Exchange 2003-在调试中工作,在没有
所以我有一个很奇怪的问题 我正在用VB.Net在.NET2.0下编写一些与MSExchange2003接口的代码。由于Exchange2003的“要求”,我不得不使用WEBDAV编写此代码 代码本身在某种程度上复制了一个进度管理过程。它在Exchange服务器上创建约会以响应用户的输入,并在SQL Server数据库中内部管理其数据。 问题是这样的:一个新的人被指派负责一个会议。该要求指出,该程序应向被取消会议的人员(如果该人员存在)生成会议取消请求,并向新人员发送会议请求 在现有人员的情况下,似乎发生了以下情况: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数据库中内部管理其数据。 问题是这样的:一个新的人被指派负责一个会议。该要求指出,该程序应向被取消会议的人员(如果该人员存在)生成会议取消请求,并向新人员发送会议请求 在现有人员的情况下,
线程.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组合是一种原子操作。在
睡眠之前和之后查看少量代码行将非常有用。