コード例 #1
0
ファイル: Webhook.cs プロジェクト: Cisien/event-grid-webhook
        public async Task <IActionResult> Post()
        {
            var subscriber = new EventGridSubscriber();

            using var ms = new MemoryStream();
            await Request.Body.CopyToAsync(ms); ms.Position = 0;

            using var sr = new StreamReader(ms);
            var message = await sr.ReadToEndAsync();

            ms.Position = 0;
            var events = subscriber.DeserializeEventGridEvents(ms);

            _logger.LogInformation($"{events.Length} Message(s) Received");

            foreach (var evt in events)
            {
                _logger.LogInformation($"Handling {evt.EventType}: {evt.GetType().Name}");
                evt.Validate();
                _ = evt.Data switch
                {
                    SubscriptionValidationEventData validationEvent => HandleValidationEvent(validationEvent),
                    IotHubDeviceTelemetryEventData iotData => await HandleIotData(iotData),
                    _ => HandleUnknown(evt.Data)
                };
            }
            return(Ok());
        }
コード例 #2
0
 private IActionResult HandleValidation(SubscriptionValidationEventData validationEventData)
 {
     return(new OkObjectResult(
                new SubscriptionValidationResponse
     {
         ValidationResponse = validationEventData.ValidationCode
     }));
 }
コード例 #3
0
ファイル: Webhook.cs プロジェクト: Cisien/event-grid-webhook
        private IActionResult HandleValidationEvent(SubscriptionValidationEventData validationEvent)
        {
            _logger.LogInformation($"{validationEvent.ValidationCode}: {validationEvent.ValidationUrl}");
            var d = new Dictionary <string, string>
            {
                ["validationResponse"] = validationEvent.ValidationCode
            };

            return(Ok(d));
        }
コード例 #4
0
        /// <summary>
        /// Validate an event grid subscription event.
        /// </summary>
        /// <param name="gridEvent">The event to validate.</param>
        /// <returns>The validation response with the validation code.</returns>
        /// <exception cref="Exception">Thrown if validation failed.</exception>
        public SubscriptionValidationResponse Validate(EventGridEvent gridEvent)
        {
            string data = gridEvent.Data.ToString();
            SubscriptionValidationEventData eventData = JsonConvert.DeserializeObject <SubscriptionValidationEventData>(data);

            if (eventData == null || string.IsNullOrEmpty(eventData.ValidationCode))
            {
                throw new Exception();
            }

            return(new SubscriptionValidationResponse(eventData.ValidationCode));
        }
        public void LmiWebhookReceiverServiceExtractEventReturnsExpectedSubscriptionRequest()
        {
            // Arrange
            var subscriptionValidationEventData = new SubscriptionValidationEventData("a validation code", "a validation url");
            var expectedResult = new WebhookRequestModel
            {
                WebhookCommand = WebhookCommand.SubscriptionValidation,
                SubscriptionValidationResponse = new SubscriptionValidationResponse {
                    ValidationResponse = subscriptionValidationEventData.ValidationCode
                },
            };
            var eventGridEvents = BuildValidEventGridEvent(Microsoft.Azure.EventGrid.EventTypes.EventGridSubscriptionValidationEvent, subscriptionValidationEventData);
            var requestBody     = JsonConvert.SerializeObject(eventGridEvents);

            // Act
            var result = lmiWebhookReceiverService.ExtractEvent(requestBody);

            // Assert
            Assert.Equal(expectedResult.WebhookCommand, result.WebhookCommand);
            Assert.Equal(expectedResult.SubscriptionValidationResponse.ValidationResponse, result.SubscriptionValidationResponse?.ValidationResponse);
        }
コード例 #6
0
        public async Task <IActionResult> HandleStorageEvent(
            [FromBody] EventGridEvent[] eventGridEvents
            )
        {
            try
            {
                Container storageEventsContainer = _cosmosClient.GetContainer(_cosmosDefaultDb, "StorageEvents");

                foreach (var eventGridEvent in eventGridEvents)
                {
                    if (eventGridEvent.EventType == EventTypes.EventGridSubscriptionValidationEvent)
                    {
                        SubscriptionValidationEventData subscriptionValidationEventData =
                            JsonConvert.DeserializeObject <SubscriptionValidationEventData>(eventGridEvent.Data.ToString());
                        return(Ok(new SubscriptionValidationResponse
                        {
                            ValidationResponse = subscriptionValidationEventData.ValidationCode
                        }));
                    }

                    StorageEventPayload payload = new StorageEventPayload(
                        eventGridEvent.Id,
                        eventGridEvent.EventType,
                        eventGridEvent.EventTime,
                        eventGridEvent.Subject,
                        eventGridEvent.Data?.ToString()
                        );
                    var result = await storageEventsContainer.CreateItemAsync <StorageEventPayload>(payload, new PartitionKey(payload.EventType));
                }

                return(Ok());
            }
            catch (Exception ex)
            {
                return(StatusCode(500, ex.Message));
            }
        }