Ejemplo n.º 1
0
        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}"
                    };
                }
            }
        }