ASP.NET CardDAV Server Example with Microsoft SQL Back-end, C#
The CardDAVServer.SqlStorage C# example is a fully-functional CardDAV server example provided with SDK that can be used to store address books and contacts in it, demonstrating how to build a CardDAV Server with SQL back-end. Here we will describe how to install and configure it. This example runs in ASP.NET on IIS or IIS Express and stores all address book data in Microsoft SQL Server database. It uses Basic authentication that validates credentials against a custom membership provider with credentials stored in web.config for the sake of simplicity.
Interoperability
This sample converts contacts created by iOS and OS X clients to a standard vCard format and extracts all data into database, including non-standard Apple properties and labels provided for E-mails, telephones, URLs, addresses, instant messengers, etc are stored and a regular vCard data. When generating vCard for Apple contacts application this sample converts a standard properties to the format understood by iOS and OS X devices, so they can propery display contact data. In case of any non-Apple client it generates a standard vCard output understood by any CardDAV client.
Custom vCard properties (X-PROP) are updated/deleted only if the client application updating the property is of the same type as the client app that created custom propery. This preserves custom properties from being overwritten by by CardDAV clients unaware how to interpret them. For example custom properties created by Apple client is sent back to Apple client only and could be updated or deleted from apple client only.
Prerequisites
To run this example you will need:
- ASP.NET 4.5 or later on Windows Server 2012, Windows Server 2008, Windows 10, Windows 8, Windows 7 or Windows Vista.
- Microsoft SQL Server Express LocalDB or Microsoft SQL Express or Microsoft SQL Server 2014 / 2012 / 2008 / 2005.
Because this sample uses null-conditional operator you need Visual Studio 2015 to compile it. If you need to support Visual Studio 2013 or earlier use the 'ASP.NET CalDAV/CardDAV Server Application' wizard in Visual Studio 2013 or earlier to generate similar code that compiles in VS 2010-2013 and does not uses null-conditional operator.
Installation and Configuration
By default CardDAV Server example with SQL back-end is installed to C:\Users\<UserName>\Documents\IT Hit\WebDAV Server Engine\vX.X.X\Samples\CardDAVServer.SqlStorage\ folder.
Setting the License
To run the example, you will need a valid IT Hit WebDAV Server Engine License. You can download the license here. Note that the Engine is fully functional with a trial license and does not have any limitations. The trial license is valid for one month and the engine will stop working after this. You can check the expiration date inside the license file.
Place the license file in the root folder of the CardDAV Example (\Samples\CardDAVServer.SqlStorage\).
Configuring the Database
In case you have Microsoft SQL LocalDB installed and are running the sample from Visual Studio you do not need to configure the database. In this case your database file, WebDav.mdf, is located in \Samples\CardDAVServer.SqlStorage\App_Data\WebDav\DB\ and will be automatically attached when you run the sample from VS, see below:
If you have Microsoft SQL Express installed you need to update the connection string. The connection string for Microsoft SQL Express is provided in a web.config file.
If you do not have Microsoft SQL Express or LocalDB installed or running your sample in IIS you will need to create and configure the database. The database script, DB.sql is located in \Samples\CardDAVServer.SqlStorage\ folder. In most case, you will open the Microsoft SQL Server console and execute this script. The script will create the database with a name ‘WebDav’ and all required tables. Finally update the connection string in the web.config file to access your new database.
SQL Back-end
The database consists of entities depicted in the figure below.
card_Address Table
Stores addresses.
Column Name | Data Type | Allow Nulls | Description | |
---|---|---|---|---|
AddressId | uniqueidentifier | No | ||
UID | nvarchar | No | Card ID to which this address belongs. | |
Type | nvarchar | Yes | Coma separated list of type flags (WORK/HOME/DOM/INTL/POSTAL/PARCEL/etc.) | |
PoBox | nvarchar | Yes | PO box. For max interoperability, should be empty. | |
AppartmentNumber | nvarchar | Yes | Appartment number. For max interoperability, should be empty. | |
Street | nvarchar | Yes | Street name. | |
Locality | nvarchar | Yes | City name. | |
Region | nvarchar | Yes | Region (e.g., state or province). | |
PostalCode | nvarchar | Yes | Postal code. | |
Country | nvarchar | Yes | Country name. | |
PreferenceLevel | tinyint | Yes | Stores prefernce level for vCard 4.0. 1-100, 1-most prefered. In case of vCard 3.0 stores 1 for prefered property. | |
Label | nvarchar | Yes | Delivery address label. | |
Geo | geography | Yes | Coordinates associated with this address. vCard 4.0 only. | |
TimeZone | nvarchar | Yes | Time zone for this address. vCard 4.0 only. | |
SortIndex | int | Yes | Propery position in vCard. Used to keep properties in the order submitted by the CardDAV client app. |
card_AddressbookFolder Table
Contain CardDAV addressbooks (addressbook folders)
Column Name | Data Type | Allow Nulls | Description | |
---|---|---|---|---|
AddressbookFolderId | uniqueidentifier | No | ||
Name | nvarchar | No | Address book name. | |
Description | nvarchar | No | Address book description. |
card_AddressbookFolderProperty Table
Addressbook WebDAV custom properties.
Column Name | Data Type | Allow Nulls | Description | |
---|---|---|---|---|
AddressbookFolderPropertyId | uniqueidentifier | No | ||
AddressbookFolderId | uniqueidentifier | No | Addressbook to which this custom property belongs to. | |
Name | nvarchar | No | Custom property name. | |
Namespace | nvarchar | No | Custom property namespace. | |
PropVal | nvarchar | No | Custom property value. |
card_CardFile Table
Stores business card (vCard files).
Column Name | Data Type | Allow Nulls | Description | |
---|---|---|---|---|
UID | nvarchar | No | Business card UID | |
AddressbookFolderId | uniqueidentifier | No | Address book (address book folder) to which this business card belongs. | |
FileName | nvarchar | No | File name without extension. In case of CardDAV this is different from UID. | |
ETag | timestamp | No | Automaticaly changes each time this object is updated. | |
CreatedUtc | datetime2 | No | Time when this file was created. Typically CardDAV clients never request this property, used for demo purposes only. | |
ModifiedUtc | datetime2 | No | Time when this file was modified. This property is updated to trigger ETag update. Typically CardDAV clients never request this property, used for demo purposes only. | |
Version | nvarchar | No | vCard version - 2.1/3.0/4.0. | |
FormattedName | nvarchar | No | Formatted name. | |
FamilyName | nvarchar | No | Last name. | |
GivenName | nvarchar | No | First name. | |
AdditionalNames | nvarchar | No | Middle names, coma-separated list. | |
HonorificPrefix | nvarchar | No | Honorific prefix. | |
HonorificSuffix | nvarchar | No | Honorific suffix. | |
Product | nvarchar | Yes | Client app that created this card. For exmple -//Apple Inc.//iOS 10.0.2//EN | |
Kind | nvarchar | Yes | Kind of object the business card represents (individual/group/org/locaton). vCard 4.0 only. | |
Nickname | nvarchar | Yes | Business card nickname. | |
Photo | varbinary | Yes | Photoghraph image associated with this business card, typically when bysiness card represents an individual. | |
PhotoMediaType | nvarchar | Yes | Photo media type. PNG/JPEG/etc. | |
Logo | varbinary | Yes | Logo associated with this business card typically when bysiness card represents an organization. | |
LogoMediaType | nvarchar | Yes | Logo media type. PNG/JPEG/etc. | |
Sound | varbinary | Yes | Digital sound content associated with this business card. | |
SoundMediaType | nvarchar | Yes | Sound media type. PNG/JPEG/etc. | |
Birthday | datetime2 | Yes | Birth date of the object the business card represents. | |
Anniversary | datetime2 | Yes | Anniversary of the object the business card represents. vCard 4.0 only. | |
Gender | nvarchar | Yes | Gender of the identity this business card represents (M - male, F- female, O - other, N - none, U - unknown). vCard 4.0 only. | |
RevisionUtc | datetime2 | Yes | Revision date-time in UTC. | |
SortString | nvarchar | Yes | Text to be used as a sort string when displaying info on a client side. Typically family name or combination of family name and given name. | |
Language | nvarchar | Yes | Language used for contacting. vCard 4.0 only. | |
TimeZone | nvarchar | Yes | Represents information related to the time zone of the business object. | |
Geo | geography | Yes | Business object location - latitude and longitude. | |
Title | nvarchar | Yes | The position or job of the business card. | |
Role | nvarchar | Yes | The function or part played in a particular situation by the business object. | |
OrgName | nvarchar | Yes | Organization name. | |
OrgUnit | nvarchar | Yes | Organization unit. | |
Categories | nvarchar | Yes | Tags associated with business card. | |
Note | nvarchar | Yes | Business card supplemental information or a comment. | |
Classification | nvarchar | Yes | Business card access classification. |
card_Email Table
Stores e-mails.
Column Name | Data Type | Allow Nulls | Description | |
---|---|---|---|---|
EmailId | uniqueidentifier | No | ||
UID | nvarchar | No | Card ID to which this telephone belongs. | |
Type | nvarchar | Yes | Coma separated list of type flags (WORK/HOME/INTERNET/X400/etc.). | |
nvarchar | No | E-mail. | ||
PreferenceLevel | tinyint | Yes | Stores prefernce level for vCard 4.0. 1-100, 1-most prefered. In case of vCard 2.1 and 3.0 stores 1 for prefered property. | |
SortIndex | int | Yes | Propery position in vCard. Used to keep properties in the order submitted by the CardDAV client app. |
card_InstantMessenger Table
Stores stores instant messengers.
Column Name | Data Type | Allow Nulls | Description | |
---|---|---|---|---|
InstantMessengerId | uniqueidentifier | No | ||
UID | nvarchar | No | Card ID to which this instant messenger belongs. | |
Type | nvarchar | Yes | Coma separated list of type flags (WORK/HOME/PERSONAL/BUSINESS/MOBILE/etc.). | |
InstantMessenger | nvarchar | No | Instant messenger. | |
PreferenceLevel | tinyint | Yes | Stores prefernce level for vCard 4.0. 1-100, 1-most prefered. In case of vCard 2.1 and 3.0 stores 1 for prefered property. | |
SortIndex | int | Yes | Propery position in vCard. Used to keep properties in the order submitted by the CardDAV client app. |
card_Telephone Table
Stores telephones
Column Name | Data Type | Allow Nulls | Description | |
---|---|---|---|---|
TelephoneId | uniqueidentifier | No | ||
UID | nvarchar | No | Card ID to which this telephone belongs. | |
Type | nvarchar | Yes | Coma separated list of type flags (WORK/HOME/TEXT/TEXTPHONE/PCS/VOICE/FAX/MSG/CELL/PAGER/BBS/MODEM/CAR/ISDN/VIDEO/etc.). | |
Telephone | nvarchar | No | Telephone. | |
PreferenceLevel | tinyint | Yes | Stores prefernce level for vCard 4.0. 1-100, 1-most prefered. In case of vCard 2.1 and 3.0 stores 1 for prefered property. | |
SortIndex | int | Yes | Propery position in vCard. Used to keep properties in the order submitted by the CardDAV client app. |
card_Url Table
Stores URLs
Column Name | Data Type | Allow Nulls | Description | |
---|---|---|---|---|
UrlId | uniqueidentifier | No | ||
UID | nvarchar | No | Card ID to which this URL belongs. | |
Type | nvarchar | Yes | Coma separated list of type flags. | |
Url | nvarchar | No | Url. | |
PreferenceLevel | tinyint | Yes | Stores prefernce level for vCard 4.0. 1-100, 1-most prefered. In case of vCard 2.1 and 3.0 stores 1 for prefered property. | |
SortIndex | int | Yes | Propery position in vCard. Used to keep properties in the order submitted by the CardDAV client app. |
card_CustomProperty Table
Stores vCard custom properties and parameters.
Column Name | Data Type | Allow Nulls | Description | |
---|---|---|---|---|
CustomPropertyId | uniqueidentifier | No | ||
ParentId | nvarchar | No | Parent Card ID or parent property ID to which this custom property or parameter belongs to. This could be UID, EmailId, InstantMessengerId, AddressId, TelephoneId, UrlId. | |
UID | nvarchar | No | Card ID to which this custom property or property parameter belongs to. | |
ClientAppName | nvarchar | Yes | Client application name that created this property. If business card is updated by any other client application except specified in this field, property will be preserved. Used to prevent custom props deletion by client apps that can not interpret this property. | |
PropertyName | nvarchar | No | Property name. This could be a custom property name (starting with 'X-') or standard property name in case standard property contains custom parameters. | |
ParameterName | nvarchar | Yes | Parameter name. If null - Value field contains property value. Otherwise Value field contains parameter value. | |
Value | nvarchar | No | Property or parameter value. If ParameterName is null - this is a property value. If ParameterName is not null - this is a parameter value. | |
SortIndex | int | Yes | Propery position in vCard. Used to keep properties in the order submitted by the CardDAV client app. |
card_Access Table
Stores user address books access privileges.
Column Name | Data Type | Allow Nulls | Description | |
---|---|---|---|---|
AccessId | uniqueidentifier | No | ||
AddressbookFolderId | uniqueidentifier | No | Address book (address book folder) for which user privileges are applied. | |
UserId | nvarchar | No | User ID of the user that has access to an address book. | |
Owner | bit | No | Specifies if a user owns an address book. | |
Read | bit | No | User has a read privilege on an address book. | |
Write | bit | No | User has a write privilege on an address book. |
See Also:
- Configuring Your WebDAV Server in IIS
- How to Connect to CardDAV Server
- WebDAV Server Samples Problems and Troubleshooting
- Creating CalDAV & CardDAV Server