public virtual void InternalActionExecuting(HttpActionContext context, CancellationToken cancellationToken) { if (context.ActionArguments.Any(a => a.Value is UpdateDocument)) { var argument = context.ActionArguments.First(a => a.Value is UpdateDocument); var updateDocument = argument.Value as UpdateDocument; if (updateDocument != null) { var typeInsideDeltaGeneric = GetTypeToUpdate(context); var jsonApiContext = new Context(new Uri(context.Request.RequestUri.AbsoluteUri)); var transformed = jsonApiTransformer.TransformBack(updateDocument, typeInsideDeltaGeneric, jsonApiContext); context.ActionArguments[argument.Key] = transformed; context.ModelState.Clear(); } } }
public override void OnActionExecuting(ActionExecutingContext context) { var isValidContentType = context.HttpContext.Request.ContentType == configuration.DefaultJsonApiMediaType; var controllerType = context.Controller.GetType(); var isControllerRegistered = configuration.IsControllerRegistered(controllerType); var actionDescriptorForBody = context.ActionDescriptor.Parameters.SingleOrDefault( x => x.BindingInfo != null && x.BindingInfo.BindingSource == BindingSource.Body); if (isControllerRegistered) { if (!isValidContentType && context.HttpContext.Request.Method != "GET") { context.Result = new UnsupportedMediaTypeResult(); return; } if (!ValidateAcceptHeader(context.HttpContext.Request.Headers)) { context.Result = new StatusCodeResult(406); return; } if (actionDescriptorForBody != null) { var json = (string)context.ActionDescriptor.Properties[actionDescriptorForBody.Name]; using (var stringReader = new StringReader(json)) { using (var jsonReader = new JsonTextReader(stringReader)) { var updateDocument = serializer.Deserialize(jsonReader, typeof(UpdateDocument)) as UpdateDocument; if (updateDocument != null) { var typeInsideDeltaGeneric = actionDescriptorForBody .ParameterType .GenericTypeArguments .Single(); var jsonApiContext = new Context(new Uri(context.HttpContext.Request.Host.Value, UriKind.Absolute)); var transformed = jsonApiTransformer.TransformBack(updateDocument, typeInsideDeltaGeneric, jsonApiContext); if (context.ActionArguments.ContainsKey(actionDescriptorForBody.Name)) { context.ActionArguments[actionDescriptorForBody.Name] = transformed; } else { context.ActionArguments.Add(actionDescriptorForBody.Name, transformed); } context.ModelState.Clear(); } } } } } else { if (actionDescriptorForBody != null) { var type = (context.Controller as Controller).ControllerContext.ActionDescriptor.Parameters.First().ParameterType; var json = (string)context.ActionDescriptor.Properties[actionDescriptorForBody.Name]; using (var stringReader = new StringReader(json)) { using (var jsonReader = new JsonTextReader(stringReader)) { var obj = serializer.Deserialize(jsonReader, type); if (context.ActionArguments.ContainsKey(actionDescriptorForBody.Name)) { context.ActionArguments[actionDescriptorForBody.Name] = obj; } else { context.ActionArguments.Add(actionDescriptorForBody.Name, obj); } } } } if (isValidContentType) { context.Result = new ContentResult() { StatusCode = 406, Content = $"The Content-Type provided was {context.HttpContext.Request.ContentType} but there was no NJsonApiCore configuration mapping for {controllerType.FullName}" }; } } }