Edit this page

Web API Binding

Since Service Pack 1 Q2 2013 RadScheduler can be bound to HTTP services using ASP.NET Web API. ASP.NET Web API is a framework that makes it easy to build HTTP services that reach a broad range of clients- both browsers and mobile devices. ASP.NET Web API is an ideal platform for building RESTful applications on the .NET Framework.

RadScheduler supports all CRUD operations "Create, Read, Update, and Delete” when it is using Web API DataBinding.

caution

Besides referencing theTelerik dlls files, RadScheduler Web API binding requires references to Newtonsoft.Json.dll , System.Net.Http.Formatting.dll , System.Web.Http.dll and System.Web.Http.WebHost.dll .

Configuration

RadScheduler Web API binding is quite similar to the usual Web Service binding with several specific differences. In the mark up of the control we should set the correct path. If RadScheduler is loading resources make sure that UseHttpGet property is set to true as for example in the code below:


<WebServiceSettings Path="api/scheduler" ResourcePopulationMode="ServerSide" UseHttpGet="true" />    

The Routing information should be defined in the Global.asax file. Here the jsonFormatter should be of type new System.Net.Http.Formatting.JsonMediaTypeFormatter() in order to have a properly working binding of RadScheduler:


<%@ Application Language="C#" %>
<%@ Import Namespace="System.Web.Routing" %>
<%@ Import Namespace="System.Web.Http" %>

<script RunAt="server">
    void Application_Start(object sender, EventArgs e)
    {
        System.Web.Routing.RouteTable.Routes.MapHttpRoute(
             name: "ActionApi",
             routeTemplate: "api/{controller}/{action}/"
         );

        var jsonFormater = new System.Net.Http.Formatting.JsonMediaTypeFormatter();

        GlobalConfiguration.Configuration.Formatters.Clear();
        GlobalConfiguration.Configuration.Formatters.Add(jsonFormater);
    }
</script>

In the controller class each event is using a WebApiData object that contains the information needed for updating the appointments. In the HTTP attributes above each event is used to define an action that will be performed through the Web API.


using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using Telerik.Web.UI;
using System.Web.Script.Serialization;

public class SchedulerController : ApiController
{

    public SchedulerController()
        : base()
    {
    }

    private JavaScriptSerializer _serializer;
    private JavaScriptSerializer JavaScriptSerializer
    {
        get
        {
            if (_serializer == null)
            {
                _serializer = new JavaScriptSerializer();
            }

            return _serializer;
        }
    }
    private XmlSchedulerProvider _provider;
    private XmlSchedulerProvider Provider
    {
        get
        {
            if (_provider == null)
            {
                _provider = new CustomXmlSchedulerProvider(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/Appointments_Outlook.xml"), true);
            }

            return _provider;
        }
    }

    private WebServiceAppointmentController _controller;
    private WebServiceAppointmentController Controller
    {
        get
        {
            if (_controller == null)
            {
                _controller = new WebServiceAppointmentController(Provider);
            }

            return _controller;
        }
    }

    [HttpGet]
    public IEnumerable<AppointmentData> GetAppointments(string schedulerInfo)
    {
        return Controller.GetAppointments(JavaScriptSerializer.Deserialize<MySchedulerInfo>(schedulerInfo));
    }

    [HttpPost]
    public IEnumerable<AppointmentData> InsertAppointment(WebApiData data)
    {
        return Controller.InsertAppointment(data.SchedulerInfo, data.AppointmentData);
    }

    [HttpPut]
    public IEnumerable<AppointmentData> UpdateAppointment(WebApiData data)
    {

        return Controller.UpdateAppointment(data.SchedulerInfo, data.AppointmentData);
    }

    [HttpPost]
    public IEnumerable<AppointmentData> CreateRecurrenceException(WebApiData data)
    {
        return Controller.CreateRecurrenceException(data.SchedulerInfo, data.RecurrenceExceptionData);
    }

    [HttpDelete]
    public IEnumerable<AppointmentData> RemoveRecurrenceExceptions(WebApiData data)
    {
        return Controller.RemoveRecurrenceExceptions(data.SchedulerInfo, data.MasterAppointmentData);
    }

    [HttpDelete]
    public IEnumerable<AppointmentData> DeleteAppointment(WebApiData data)
    {
        return Controller.DeleteAppointment(data.SchedulerInfo, data.AppointmentData, data.DeleteSeries);
    }

    [HttpGet]
    public IEnumerable<ResourceData> GetResources(string schedulerInfo)
    {
        var o = new JavaScriptSerializer().Deserialize<MySchedulerInfo>(schedulerInfo);
        return Controller.GetResources(o);
    }
}


Imports Newtonsoft.Json.Linq
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web.Http
Imports Telerik.Web.UI
Imports System.Web.Script.Serialization

Public Class ValuesController1
    Inherits ApiController

    Public Sub New()
        MyBase.New()
    End Sub

    Private _serializer As JavaScriptSerializer
    Private ReadOnly Property JavaScriptSerializer() As JavaScriptSerializer
        Get
            If _serializer Is Nothing Then
                _serializer = New JavaScriptSerializer()
            End If

            Return _serializer
        End Get
    End Property
    Private _provider As XmlSchedulerProvider
    Private ReadOnly Property Provider() As XmlSchedulerProvider
        Get
            If _provider Is Nothing Then
                _provider = New CustomXmlSchedulerProvider(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/Appointments_Outlook.xml"), True)
            End If

            Return _provider
        End Get
    End Property

    Private _controller As WebServiceAppointmentController
    Private ReadOnly Property Controller() As WebServiceAppointmentController
        Get
            If _controller Is Nothing Then
                _controller = New WebServiceAppointmentController(Provider)
            End If

            Return _controller
        End Get
    End Property

    <HttpGet> _
    Public Function GetAppointments(schedulerInfo As String) As IEnumerable(Of AppointmentData)
        Return Controller.GetAppointments(JavaScriptSerializer.Deserialize(Of MySchedulerInfo)(schedulerInfo))
    End Function

    <HttpPost> _
    Public Function InsertAppointment(data As WebApiData) As IEnumerable(Of AppointmentData)
        Return Controller.InsertAppointment(data.SchedulerInfo, data.AppointmentData)
    End Function

    <HttpPut> _
    Public Function UpdateAppointment(data As WebApiData) As IEnumerable(Of AppointmentData)

        Return Controller.UpdateAppointment(data.SchedulerInfo, data.AppointmentData)
    End Function

    <HttpPost> _
    Public Function CreateRecurrenceException(data As WebApiData) As IEnumerable(Of AppointmentData)
        Return Controller.CreateRecurrenceException(data.SchedulerInfo, data.RecurrenceExceptionData)
    End Function

    <HttpDelete> _
    Public Function RemoveRecurrenceExceptions(data As WebApiData) As IEnumerable(Of AppointmentData)
        Return Controller.RemoveRecurrenceExceptions(data.SchedulerInfo, data.MasterAppointmentData)
    End Function

    <HttpDelete> _
    Public Function DeleteAppointment(data As WebApiData) As IEnumerable(Of AppointmentData)
        Return Controller.DeleteAppointment(data.SchedulerInfo, data.AppointmentData, data.DeleteSeries)
    End Function

    <HttpGet> _
    Public Function GetResources(schedulerInfo As String) As IEnumerable(Of ResourceData)
        Dim o = New JavaScriptSerializer().Deserialize(Of MySchedulerInfo)(schedulerInfo)
        Return Controller.GetResources(o)
    End Function
End Class

In order for all CRUD operations to work properly when you host the application on IIS server in the configuration file, you need to add the following settings in the system.webServer section:


    <remove name="WebDAV" />
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<modules runAllManagedModulesForAllRequests="true">
    <add name="RadUploadModule" preCondition="integratedMode" type="Telerik.Web.UI.RadUploadHttpModule" />
    <remove name="WebDAVModule" />
</modules>