private void HandleItemUpdated(SPRemoteEventProperties properties)
        {
            using (ClientContext clientContext = TokenHelper.CreateRemoteEventReceiverClientContext(properties))
            {
                if (clientContext != null)
                {
                    List     requestList = clientContext.Web.Lists.GetById(properties.ItemEventProperties.ListId);
                    ListItem item        = requestList.GetItemById(properties.ItemEventProperties.ListItemId);
                    clientContext.Load(item);
                    clientContext.ExecuteQuery();

                    if (String.Compare(item[SiteRequestFields.State].ToString(), "Approved", true) == 0)
                    {
                        try
                        {
                            string         site_title       = item[SiteRequestFields.Title].ToString();
                            string         site_description = item[SiteRequestFields.Description].ToString();
                            string         site_template    = item[SiteRequestFields.Template].ToString();
                            string         site_url         = item[SiteRequestFields.Url].ToString();
                            SharePointUser site_owner       = LabHelper.BaseSetUser(clientContext, item, SiteRequestFields.Owner);
                            LabHelper.CreateSiteCollection(clientContext, site_url, site_template, site_title, site_description, site_owner.Email);
                            item[SiteRequestFields.State] = "COMPLETED";
                        }
                        catch (Exception ex)
                        {
                            item[SiteRequestFields.State]         = "ERROR";
                            item[SiteRequestFields.StatusMessage] = ex.Message;
                        }
                        item.Update();
                        clientContext.ExecuteQuery();
                    }
                }
            }
        }
        private void HandleAppInstalled(SPRemoteEventProperties properties)
        {
            using (ClientContext ctx = TokenHelper.CreateAppEventClientContext(properties, false))
            {
                if (ctx != null)
                {
                    //Add a list to the host web
                    List eventReceiverList = LabHelper.AddList(ctx, ctx.Web, Microsoft.SharePoint.Client.ListTemplateType.GenericList, ListName);

                    //Remove existing event handlers
                    ctx.Load(eventReceiverList, x => x.EventReceivers);
                    ctx.ExecuteQuery();
                    foreach (var rer in eventReceiverList.EventReceivers)
                    {
                        if (rer.ReceiverName == ReceiverName)
                        {
                            System.Diagnostics.Trace.WriteLine("Found existing ItemAdded receiver at " + rer.ReceiverUrl);
                            try
                            {
                                //This will fail when deploying via F5, but works when deployed to production
                                rer.DeleteObject();
                                ctx.ExecuteQuery();
                            }
                            catch (Exception ex)
                            {
                                System.Diagnostics.Trace.WriteLine(ex.Message);
                            }
                        }
                    }

                    //Get WCF URL where this message was handled
                    OperationContext op  = OperationContext.Current;
                    Message          msg = op.RequestContext.RequestMessage;

                    //Create a new event receiver
                    EventReceiverDefinitionCreationInformation receiver = new EventReceiverDefinitionCreationInformation();
                    receiver.EventType       = EventReceiverType.ItemAdded;
                    receiver.ReceiverUrl     = msg.Headers.To.ToString();
                    receiver.ReceiverName    = ReceiverName;
                    receiver.Synchronization = EventReceiverSynchronization.Synchronous;

                    //Add the new event receiver to a list in the host web
                    eventReceiverList.EventReceivers.Add(receiver);
                    ctx.ExecuteQuery();
                }
            }
        }