/// <summary> /// Reads the JSON HTTP request entity body. /// </summary> /// <param name="context">The <see cref="ResourceExecutingContext"/>.</param> /// <returns> /// A <see cref="Task"/> that on completion provides a <see cref="JObject"/> containing the HTTP request entity /// body. /// </returns> protected virtual async Task <JObject> ReadAsJsonAsync(ResourceExecutingContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } var request = context.HttpContext.Request; if (request.Body == null || !request.ContentLength.HasValue || request.ContentLength.Value == 0L || !HttpMethods.IsPost(request.Method) || !WebHookHttpRequestUtilities.IsJson(request)) { // Other filters will log and return errors about these conditions. return(null); } var modelState = context.ModelState; var actionContext = new ActionContext( context.HttpContext, context.RouteData, context.ActionDescriptor, modelState); var valueProviderFactories = context.ValueProviderFactories; var valueProvider = await CompositeValueProvider.CreateAsync(actionContext, valueProviderFactories); var bindingContext = DefaultModelBindingContext.CreateBindingContext( actionContext, valueProvider, _jObjectMetadata, bindingInfo: null, modelName: ModelStateRootKey); // Read request body. await _bodyModelBinder.BindModelAsync(bindingContext); if (!bindingContext.ModelState.IsValid) { return(null); } if (!bindingContext.Result.IsModelSet) { throw new InvalidOperationException(Resources.VerifyNotification_ModelBindingFailed); } // Success return((JObject)bindingContext.Result.Model); }
/// <inheritdoc /> public void OnResourceExecuting(ResourceExecutingContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } var request = context.HttpContext.Request; switch (_requestMetadata.BodyType) { case WebHookBodyType.Form: if (!request.HasFormContentType) { context.Result = CreateUnsupportedMediaTypeResult(Resources.VerifyBody_NoFormData); } break; case WebHookBodyType.Json: if (!WebHookHttpRequestUtilities.IsJson(request)) { context.Result = CreateUnsupportedMediaTypeResult(Resources.VerifyBody_NoJson); } break; case WebHookBodyType.Xml: if (!WebHookHttpRequestUtilities.IsXml(request)) { context.Result = CreateUnsupportedMediaTypeResult(Resources.VerifyBody_NoXml); } break; default: var message = string.Format( CultureInfo.CurrentCulture, Resources.General_InvalidEnumValue, nameof(WebHookBodyType), _requestMetadata.BodyType); throw new InvalidOperationException(message); } }