|
The code in this article will show you how to build a web page that can:
- retrieve information from the Outlook calendars of your team members
- show this information in a single neat overview.
The code is written in VB.NET, but it can easily be converted into C# or any other
language.

Configuration
Just copy all the files in the sample code to the root of an existing
web site, but take care not to overwrite any existing files. If a file named
"index.aspx" already exists, just copy the file from the sample code after
renaming it to something else, e.g. "calendar.aspx". If a file named
"web.config" already exists, don't overwrite it, this will destroy all the
existing settings. Just open the existing "web.config" file, and add these 5
lines to the existing "appSettings" settings.
<add key="ServerName" value="ExchangeServerName"/>
<add key="WindowsDomain" value="OURDOMAIN"/>
<add key="UserForReadingCalendars" value="ExchReader"/>
<add key="PwdForReadingCalendars" value="secret"/>
<add key="Usernames" value="Anne,John,Fred,Kate"/>
Then, change the value for each of these keys according to your own
situation:
- The "ServerName" setting is the name of the Exchange server on the network
- The "WindowsDomain" setting is the name of the Windows domain controlling the user
database
- The user indicated in the key "UserForReadingCalendars" should at least
have read permissions on the Outlook calendars. Each user listed in the 5th setting should grant this
permission through Outlook's configuration settings. For Outlook 2003, see Share my Outlook calendar.
- The "PwdForReadingCalendars" is the password of the user in the key
"UserForReadingCalendars"
- The last setting "Usernames" is a list of your team members, separated by
commas. The names should be the names of their mail boxes (i.e. the logon
names). These users should share their calenders to the user that was set in the 3rd setting.
How it works
The first part is to retrieve the calendars from the Exchange server. There
are several ways to do this:
- ADO (ExOLEDB provider)
- CDOEX
- WebDAV
I chose the WebDAV method. It has one inconvenience: it's slow when there are
lots of calendars to be read.
In this case, we need to create a request that will read the calendar on a
particular date. This is the code that will retrieve all the events in the
calendar, especially the properties: start, end, busy status, and of course: the
content:
Function LookUpCalendar(ByVal Name As String, ByVal dDate As DateTime) As XmlDocument
Dim strURL As String = "http://" & ConfigurationSettings.AppSettings("ServerName") & "/exchange/" & Name & "/calendar/"
Dim strRequest As String = "<?xml version=""1.0""?>" & _
"<g:searchrequest DAV:?? xmlns:g="">" & _
"<g:sql>SELECT ""urn:schemas:calendar:location"", ""urn:schemas:httpmail:subject"", " & _
"""urn:schemas:calendar:dtstart"", ""urn:schemas:calendar:dtend"", " & _
"""urn:schemas:calendar:busystatus"", ""urn:schemas:calendar:instancetype"" " & _
"FROM Scope('SHALLOW TRAVERSAL OF """ & strURL & """') " & _
"WHERE NOT ""urn:schemas:calendar:instancetype"" = 1 " & _
"AND ""DAV:contentclass"" = 'urn:content-classes:appointment' " & _
"AND ""urn:schemas:calendar:dtstart"" > '" & _
String.Format("{0:yyyy/MM/dd}", dDate) & " 00:00:00' " & _
"AND ""urn:schemas:calendar:dtend"" < '" & _
String.Format("{0:yyyy/MM/dd}", dDate.AddDays(1)) & " 00:00:00' " & _
"ORDER BY ""urn:schemas:calendar:dtstart"" ASC" & _
"</g:sql></g:searchrequest>"
Dim strStatusText As String = ""
Dim Status As Integer
Dim ResponseXmlDoc As XmlDocument = SendRequest("SEARCH", strURL, strRequest, strStatusText, Status)
'Display the results.
If (Status >= 200 And Status < 300) Then
AddInfo("Success! " & "Result = " & Status & ": " & strStatusText, 2)
Return ResponseXmlDoc
ElseIf Status = 401 Then
AddInfo("<BR /><FONT color=red>Permission denied!</FONT>", 2)
AddInfo("<FONT color=red>Check your permissions for this item.</FONT>", 2)
Else AddInfo("<FONT color=red>Request failed.</FONT>",
AddInfo("<FONT color=red>Result = " & Status & ": " & strStatusText</FONT>, 2)
End If
Return Nothing
End Function
The result will be an XmlDocument object.
The function calls another function: SendRequest. This is standard code that
will send the WebDAV SEARCH request:
Function SendRequest(ByVal strCommand As String, ByVal strURL As String, ByVal strBody As String, _
ByRef strStatusText As String, ByRef iStatCode As Integer) As XmlDocument
Try
' Create a new CredentialCache object and fill it with the network credentials required to access the server.
Dim Username As String = ConfigurationSettings.AppSettings("UserForReadingCalendars")
Dim Password As String = ConfigurationSettings.AppSettings("PwdForReadingCalendars")
Dim strDomain As String = ConfigurationSettings.AppSettings("WindowsDomain")
Dim myCred As New NetworkCredential(Username, Password, strDomain)
Dim myUri As System.Uri = New System.Uri(strURL)
Dim MyCredentialCache As New CredentialCache MyCredentialCache.Add(myUri, "NTLM", myCred)
' Create the HttpWebRequest object.
Dim objRequest As HttpWebRequest = CType(WebRequest.Create(strURL), HttpWebRequest)
' Add the network credentials to the request.
objRequest.Credentials = MyCredentialCache
' Specify the method. objRequest.Method = strCommand
' Set Headers objRequest.KeepAlive = True
objRequest.Headers.Set("Pragma", "no-cache")
objRequest.ContentType = "text/xml"
'Set the request timeout to 5 minutes
objRequest.Timeout = 300000
If (strBody.Length > 0) Then
' Store the data in a byte array
Dim ByteQuery() As Byte = System.Text.Encoding.ASCII.GetBytes(strBody)
objRequest.ContentLength = ByteQuery.Length
Dim QueryStream As Stream = objRequest.GetRequestStream()
' Write the data to be posted to the Request Stream
QueryStream.Write(ByteQuery, 0, ByteQuery.Length)
QueryStream.Close()
End If
' Send the method request and get the response from the server.
Dim objResponse As HttpWebResponse = CType(objRequest.GetResponse(), HttpWebResponse)
' Get the Status code iStatCode = objResponse.StatusCode
strStatusText = objResponse.StatusDescription
' Get the XML response stream.
Dim ResponseStream As System.IO.Stream = objResponse.GetResponseStream()
' Create the XmlDocument object from the XML response stream.
Dim ResponseXmlDoc As New System.Xml.XmlDocument
ResponseXmlDoc.Load(ResponseStream)
' Clean up. ResponseStream.Close()
objResponse.Close()
Return ResponseXmlDoc
Catch ex As Exception
' Catch any exceptions. Any error codes from the method requests on the server will be caught here, also.
AddInfo("& ex.ToString &"", 2)
End Try
Return Nothing
End Function
Finally, all the results are brought together in a DataTable object, and
presented in a schedule with our ScheduleGeneral custom control. The control will do all the
work, we just bind it to the DataTable.
Points of interest
The project is an example of how to retrieve a list of Outlook calendar events from an
Exchange server with WebDAV.
History
This is the first version 1.0.
|