private static void AddDomainControllerFormatters(List<MediaTypeFormatter> formatters, DomainControllerDescription description) { var cachedSerializers = _serializerCache.GetOrAdd(description.ControllerType, controllerType => { // for the specified controller type, set the serializers for the built // in framework types List<SerializerInfo> serializers = new List<SerializerInfo>(); Type[] exposedTypes = description.EntityTypes.ToArray(); serializers.Add(GetSerializerInfo(typeof(ChangeSetEntry[]), exposedTypes)); return serializers; }); JsonMediaTypeFormatter formatterJson = new JsonMediaTypeFormatter(); formatterJson.SerializerSettings = new JsonSerializerSettings() { PreserveReferencesHandling = PreserveReferencesHandling.Objects, TypeNameHandling = TypeNameHandling.All }; XmlMediaTypeFormatter formatterXml = new XmlMediaTypeFormatter(); // apply the serializers to configuration foreach (var serializerInfo in cachedSerializers) { formatterXml.SetSerializer(serializerInfo.ObjectType, serializerInfo.XmlSerializer); } formatters.Add(formatterJson); formatters.Add(formatterXml); }
/// <summary> /// Gets the <see cref="HttpActionContext"/> for the currently executing action. /// </summary> // protected internal HttpActionContext ActionContext { get; internal set; } protected override void Initialize(HttpControllerContext controllerContext) { // ensure that the service is valid and all custom metadata providers // have been registered _description = DomainControllerDescription.GetDescription(controllerContext.ControllerDescriptor); base.Initialize(controllerContext); }
private static IEnumerable <MediaTypeFormatter> GetFormatters(HttpControllerDescriptor descr) { HttpConfiguration config = descr.Configuration; DomainControllerDescription dataDesc = DomainControllerDescription.GetDescription(descr); List <MediaTypeFormatter> list = new List <MediaTypeFormatter>(); AddFormattersFromConfig(list, config); AddDomainControllerFormatters(list, dataDesc); return(list); }
public override HttpActionDescriptor SelectAction(HttpControllerContext controllerContext) { // first check to see if this is a call to Submit string actionName; if (controllerContext.RouteData.Values.TryGetValue(ActionRouteKey, out actionName) && actionName.Equals(SubmitActionValue, StringComparison.Ordinal)) { return(new SubmitActionDescriptor(controllerContext.ControllerDescriptor, controllerContext.Controller.GetType())); } // next check to see if this is a direct invocation of a CUD action DomainControllerDescription description = DomainControllerDescription.GetDescription(controllerContext.ControllerDescriptor); UpdateActionDescriptor action = description.GetUpdateAction(actionName); if (action != null) { return(new SubmitProxyActionDescriptor(action)); } return(base.SelectAction(controllerContext)); }
/// <summary> /// For all operations in the current changeset, validate that the operation exists, and /// set the operation entry. /// </summary> internal static void ResolveActions(DomainControllerDescription description, IEnumerable <ChangeSetEntry> changeSet) { // Resolve and set the action for each operation in the changeset foreach (ChangeSetEntry changeSetEntry in changeSet) { Type entityType = changeSetEntry.Entity.GetType(); UpdateActionDescriptor actionDescriptor = null; if (changeSetEntry.Operation == ChangeOperation.Insert || changeSetEntry.Operation == ChangeOperation.Update || changeSetEntry.Operation == ChangeOperation.Delete) { actionDescriptor = description.GetUpdateAction(entityType, changeSetEntry.Operation); } // if a custom method invocation is specified, validate that the method exists bool isCustomUpdate = false; if (changeSetEntry.EntityActions != null && changeSetEntry.EntityActions.Any()) { var entityAction = changeSetEntry.EntityActions.Single(); UpdateActionDescriptor customMethodOperation = description.GetCustomMethod(entityType, entityAction.Key); if (customMethodOperation == null) { throw Error.InvalidOperation(Resource.DomainController_InvalidAction, entityAction.Key, entityType.Name); } // if the primary action for an update is null but the entry // contains a valid custom update action, its considered a "custom update" isCustomUpdate = actionDescriptor == null && customMethodOperation != null; } if (actionDescriptor == null && !isCustomUpdate) { throw Error.InvalidOperation(Resource.DomainController_InvalidAction, changeSetEntry.Operation.ToString(), entityType.Name); } changeSetEntry.ActionDescriptor = actionDescriptor; } }
private static void AddDomainControllerFormatters(List <MediaTypeFormatter> formatters, DomainControllerDescription description) { var cachedSerializers = _serializerCache.GetOrAdd(description.ControllerType, controllerType => { // for the specified controller type, set the serializers for the built // in framework types List <SerializerInfo> serializers = new List <SerializerInfo>(); Type[] exposedTypes = description.EntityTypes.ToArray(); serializers.Add(GetSerializerInfo(typeof(ChangeSetEntry[]), exposedTypes)); return(serializers); }); JsonMediaTypeFormatter formatterJson = new JsonMediaTypeFormatter(); formatterJson.SerializerSettings = new JsonSerializerSettings() { PreserveReferencesHandling = PreserveReferencesHandling.Objects, TypeNameHandling = TypeNameHandling.All }; XmlMediaTypeFormatter formatterXml = new XmlMediaTypeFormatter(); // apply the serializers to configuration foreach (var serializerInfo in cachedSerializers) { formatterXml.SetSerializer(serializerInfo.ObjectType, serializerInfo.XmlSerializer); } formatters.Add(formatterJson); formatters.Add(formatterXml); }
/// <summary> /// For all operations in the current changeset, validate that the operation exists, and /// set the operation entry. /// </summary> internal static void ResolveActions(DomainControllerDescription description, IEnumerable<ChangeSetEntry> changeSet) { // Resolve and set the action for each operation in the changeset foreach (ChangeSetEntry changeSetEntry in changeSet) { Type entityType = changeSetEntry.Entity.GetType(); UpdateActionDescriptor actionDescriptor = null; if (changeSetEntry.Operation == ChangeOperation.Insert || changeSetEntry.Operation == ChangeOperation.Update || changeSetEntry.Operation == ChangeOperation.Delete) { actionDescriptor = description.GetUpdateAction(entityType, changeSetEntry.Operation); } // if a custom method invocation is specified, validate that the method exists bool isCustomUpdate = false; if (changeSetEntry.EntityActions != null && changeSetEntry.EntityActions.Any()) { var entityAction = changeSetEntry.EntityActions.Single(); UpdateActionDescriptor customMethodOperation = description.GetCustomMethod(entityType, entityAction.Key); if (customMethodOperation == null) { throw Error.InvalidOperation(Resource.DomainController_InvalidAction, entityAction.Key, entityType.Name); } // if the primary action for an update is null but the entry // contains a valid custom update action, its considered a "custom update" isCustomUpdate = actionDescriptor == null && customMethodOperation != null; } if (actionDescriptor == null && !isCustomUpdate) { throw Error.InvalidOperation(Resource.DomainController_InvalidAction, changeSetEntry.Operation.ToString(), entityType.Name); } changeSetEntry.ActionDescriptor = actionDescriptor; } }