Пример #1
0
        private HttpActionDescriptor GetNewActionDescriptor(
            VersionNumber theRequestedApiVersion, 
            HttpActionDescriptor theOriginalHttpActionDescriptor)
        {
            var aApiVersionAttributes = theOriginalHttpActionDescriptor.GetCustomAttributes<ApiVersionAttribute>();
            if (aApiVersionAttributes == null || aApiVersionAttributes.Count == 0)
            {
                return theOriginalHttpActionDescriptor;
            }

            var aActionMappings = GetActionMapping(theOriginalHttpActionDescriptor.ControllerDescriptor);
            var aMatchedActionDescriptorMappings = new Dictionary<VersionNumber, HttpActionDescriptor>();
            foreach (var aApiVersionAttribute in aApiVersionAttributes)
            {
                var aActionName = aApiVersionAttribute.OperatioName;
                if (!aActionMappings.Contains(aActionName))
                {
                    continue;
                }

                var aHttpActionDescriptor = aActionMappings[aActionName].ElementAt(0);
                aMatchedActionDescriptorMappings[aApiVersionAttribute.VersionNumber] = aHttpActionDescriptor;
            }

            // this mapping could be cached
            if (aMatchedActionDescriptorMappings.Count == 0)
            {
                return theOriginalHttpActionDescriptor;
            }

            // customize version select logic here
            return CustomizedActionDescriptorSelector(theRequestedApiVersion, aMatchedActionDescriptorMappings);
        }
        private IDictionary<string, object> GetParameterValuePairs(HttpActionDescriptor actionDescriptor)
        {
            IDictionary<string, object> parameterValuePairs = new Dictionary<string, object>();

            foreach (SwaggerDefaultValue defaultValue in actionDescriptor.GetCustomAttributes<SwaggerDefaultValue>())
            {
                parameterValuePairs.Add(defaultValue.Name, defaultValue.Value);
            }

            foreach (var parameter in actionDescriptor.GetParameters())
            {
                if (!parameter.ParameterType.IsPrimitive)
                {
                    foreach (PropertyInfo property in parameter.ParameterType.GetProperties())
                    {
                        var defaultValue = GetDefaultValue(property);

                        if (defaultValue != null)
                        {
                            parameterValuePairs.Add(property.Name, defaultValue);
                        }
                    }
                }
            }

            return parameterValuePairs;
        }
Пример #3
0
 private static bool HasQueryableAttribute(HttpActionDescriptor actionDescriptor)
 {
     #pragma warning disable 0618 // Disable obsolete warning for QueryableAttribute.
     return actionDescriptor.GetCustomAttributes<QueryableAttribute>(inherit: true).Any() ||
          actionDescriptor.ControllerDescriptor.GetCustomAttributes<QueryableAttribute>(inherit: true).Any();
     #pragma warning restore 0618
 }
		/// <summary>
		/// Gets the documentation based on <see cref="T:System.Web.Http.Controllers.HttpActionDescriptor" />.
		/// </summary>
		/// <param name="actionDescriptor">The action descriptor.</param>
		/// <returns>The documentation for the action.</returns>
		public virtual string GetDocumentation(HttpActionDescriptor actionDescriptor)
		{
			var methodNode = this.GetMethodNode(actionDescriptor);

			var s = new List<string>
						{
							GetTagValueForAction(methodNode, "summary"), 
							GetTagValueForAction(methodNode, "remarks")
						};

			// Add message if controller requires authorization
			if (actionDescriptor.GetCustomAttributes<AuthorizeAttribute>().Any())
			{
				s.Add("<p><i class='fa fa-lock'></i> Requires authorization!</p>");
			}

			// Add message if action is marked as Obsolete
			ObsoleteAttribute obsoleteAttribute = actionDescriptor.GetCustomAttributes<ObsoleteAttribute>().FirstOrDefault();
			if (obsoleteAttribute != null)
			{
				s.Add(string.Format("<p><i class='fa fa-warning'></i> This action is Obsolete: {0}</p>",
					string.IsNullOrEmpty(obsoleteAttribute.Message) ? "<i>unknown reason</i>" : obsoleteAttribute.Message));
			}

			return string.Join("", s.Where(x => !string.IsNullOrEmpty(x)));
		}
        public static WrapResultAttribute GetWrapResultAttributeOrNull(HttpActionDescriptor actionDescriptor)
        {
            if (actionDescriptor == null)
            {
                return null;
            }

            //Try to get for dynamic APIs (dynamic web api actions always define __OwDynamicApiDontWrapResultAttribute)
            var wrapAttr = actionDescriptor.Properties.GetOrDefault("__OwDynamicApiDontWrapResultAttribute") as WrapResultAttribute;
            if (wrapAttr != null)
            {
                return wrapAttr;
            }

            //Get for the action
            wrapAttr = actionDescriptor.GetCustomAttributes<WrapResultAttribute>().FirstOrDefault();
            if (wrapAttr != null)
            {
                return wrapAttr;
            }

            //Get for the controller
            wrapAttr = actionDescriptor.ControllerDescriptor.GetCustomAttributes<WrapResultAttribute>().FirstOrDefault();
            if (wrapAttr != null)
            {
                return wrapAttr;
            }

            //Not found
            return null;
        }
Пример #6
0
 protected override IReadOnlyList<IDirectRouteFactory> GetActionRouteFactories(HttpActionDescriptor actionDescriptor)
 {
     //Honor inherited route attributes, but only for the MicroCms.WebApi assembly.
     // To reduce conflicts and changing global behavior for apps that host MicroCms Web API
     if (IsCmsApiController(actionDescriptor.ControllerDescriptor.ControllerType))
         return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>(true);
     return base.GetActionRouteFactories(actionDescriptor);
 }
        /// <summary>
        /// Returns an enumeration of filters.
        /// </summary>
        /// <param name="configuration">The HTTP configuration.</param>
        /// <param name="actionDescriptor">The action descriptor.</param>
        /// <returns>
        /// An enumeration of filters.
        /// </returns>
        public IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor) {
            if (actionDescriptor == null ||
                (!IsIQueryable(actionDescriptor.ReturnType)) ||
                actionDescriptor.GetCustomAttributes<QueryableAttribute>().Any() ||
                actionDescriptor.GetParameters().Any(parameter => typeof (ODataQueryOptions).IsAssignableFrom(parameter.ParameterType)))
                return Enumerable.Empty<FilterInfo>();

            return new[] {new FilterInfo(_filter, FilterScope.Global)};
        }
        public string GetResponseDocumentation(HttpActionDescriptor actionDescriptor)
        {
            var apiDocumentation = actionDescriptor.GetCustomAttributes<ApiResponseDocumentationAttribute>().FirstOrDefault();
            if (apiDocumentation != null)
            {
                return apiDocumentation.Description;
            }

            return String.Empty;
        }
        string IDocumentationProvider.GetDocumentation(HttpActionDescriptor actionDescriptor)
        {
            var actionDoc = actionDescriptor.GetCustomAttributes<ActionDocAttribute>().FirstOrDefault();
            if (actionDoc != null)
            {
                return actionDoc.Documentation;
            }

            return string.Format("Documentation for '{0}'.", actionDescriptor.ActionName);
        }
Пример #10
0
 public string GetDocumentation(HttpActionDescriptor actionDescriptor)
 {
     string doc = "";
     var attr = actionDescriptor.GetCustomAttributes<ApiDocAttribute>().FirstOrDefault();
     if (attr != null)
     {
         doc = attr.Documentation;
     }
     return doc;
 }
        private static ODataActionDescriptor GetODataActionDescriptorFromAttributeRoute(HttpActionDescriptor actionDescriptor, ODataRoute oDataRoute, HttpConfiguration httpConfig)
        {
            Contract.Requires(actionDescriptor != null);
            Contract.Requires(oDataRoute != null);
            Contract.Ensures(Contract.Result<ODataActionDescriptor>() != null);

            var odataRouteAttribute = actionDescriptor.GetCustomAttributes<ODataRouteAttribute>()?.FirstOrDefault();
            Contract.Assume(odataRouteAttribute != null);
            var pathTemplate = HttpUtility.UrlDecode(oDataRoute.GetRoutePrefix().AppendPathSegment(odataRouteAttribute.PathTemplate));
            Contract.Assume(pathTemplate != null);
            return new ODataActionDescriptor(actionDescriptor, oDataRoute, pathTemplate, CreateHttpRequestMessage(actionDescriptor, oDataRoute, httpConfig));
        }
        public IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
        {
            if (actionDescriptor == null ||
              actionDescriptor.GetCustomAttributes<QueryableAttribute>().Any() || // if method already has a QueryableAttribute (or subclass) then skip it.
              actionDescriptor.GetParameters().Any(parameter => typeof(ODataQueryOptions).IsAssignableFrom(parameter.ParameterType))
            )
            {
                return Enumerable.Empty<FilterInfo>();
            }

            return new[] { new FilterInfo(_filter, FilterScope.Global) };
        }
Пример #13
0
 protected override IReadOnlyList<IDirectRouteFactory> GetActionRouteFactories(HttpActionDescriptor actionDescriptor)
 {
     var fromBase = base.GetActionRouteFactories(actionDescriptor);
     System.Collections.ObjectModel.Collection<IDirectRouteFactory> newFactories = actionDescriptor.GetCustomAttributes<IDirectRouteFactory>(inherit: true);
     var combined = new List<IDirectRouteFactory>();
     if(fromBase != null)
     {
         combined.AddRange(fromBase);
     }
     if(newFactories != null)
     {
         combined.AddRange(newFactories);
     }
     return fromBase == null ? combined : fromBase;
 }
        internal ODataRouteBuilderContext(
            HttpConfiguration configuration,
            ApiVersion apiVersion,
            ODataRoute route,
            HttpActionDescriptor actionDescriptor,
            IList <ApiParameterDescription> parameterDescriptions,
            IModelTypeBuilder modelTypeBuilder,
            ODataApiExplorerOptions options)
        {
            Contract.Requires(configuration != null);
            Contract.Requires(apiVersion != null);
            Contract.Requires(route != null);
            Contract.Requires(actionDescriptor != null);
            Contract.Requires(parameterDescriptions != null);
            Contract.Requires(modelTypeBuilder != null);
            Contract.Requires(options != null);

            ApiVersion            = apiVersion;
            serviceProvider       = configuration.GetODataRootContainer(route);
            EdmModel              = serviceProvider.GetRequiredService <IEdmModel>();
            routeAttribute        = actionDescriptor.GetCustomAttributes <ODataRouteAttribute>().FirstOrDefault();
            RouteTemplate         = routeAttribute?.PathTemplate;
            Route                 = route;
            ActionDescriptor      = actionDescriptor;
            ParameterDescriptions = parameterDescriptions;
            Options               = options;
            UrlKeyDelimiter       = configuration.GetUrlKeyDelimiter() ?? Parentheses;

            var container = EdmModel.EntityContainer;

            if (container == null)
            {
                IsRouteExcluded = true;
                return;
            }

            EntitySet = container.FindEntitySet(actionDescriptor.ControllerDescriptor.ControllerName);
            Operation = container.FindOperationImports(actionDescriptor.ActionName).FirstOrDefault()?.Operation ??
                        EdmModel.FindDeclaredOperations(container.Namespace + "." + actionDescriptor.ActionName).FirstOrDefault();
            ActionType = GetActionType(EntitySet, Operation);

            if (Operation?.IsAction() == true)
            {
                ConvertODataActionParametersToTypedModel(modelTypeBuilder, (IEdmAction)Operation, actionDescriptor.ControllerDescriptor.ControllerName);
            }
        }
Пример #15
0
        /// <summary>
        /// Determines whether the action should be considered for <see cref="ApiExplorer.ApiDescriptions"/> generation. Called when initializing the <see cref="ApiExplorer.ApiDescriptions"/>.
        /// </summary>
        /// <param name="actionVariableValue">The action variable value from the route.</param>
        /// <param name="actionDescriptor">The action descriptor.</param>
        /// <param name="route">The route.</param>
        /// <returns><c>true</c> if the action should be considered for <see cref="ApiExplorer.ApiDescriptions"/> generation, <c>false</c> otherwise.</returns>
        public virtual bool ShouldExploreAction(string actionVariableValue, HttpActionDescriptor actionDescriptor, IHttpRoute route)
        {
            if (actionDescriptor == null)
            {
                throw Error.ArgumentNull("actionDescriptor");
            }

            if (route == null)
            {
                throw Error.ArgumentNull("route");
            }

            ApiExplorerSettingsAttribute setting = actionDescriptor.GetCustomAttributes <ApiExplorerSettingsAttribute>().FirstOrDefault();

            return((setting == null || !setting.IgnoreApi) &&
                   MatchRegexConstraint(route, RouteValueKeys.Action, actionVariableValue));
        }
Пример #16
0
        private bool DescriptionAuthorized(HttpActionContext actionContext, HttpActionDescriptor actionDescriptor) 
        {
     
            var attributes = actionDescriptor.GetCustomAttributes<Attribute>()
                 .ToArray();

            IEnumerable<ISwaggerAuthorization> swaggerAuthorization =
                attributes == null ? new List<ISwaggerAuthorization>() :
                                    attributes.Where(c => c as ISwaggerAuthorization != null).Cast<ISwaggerAuthorization>().ToList();

            foreach (var auth in swaggerAuthorization) {
                if (!auth.IsDescriptionAuthorized(actionContext)) {
                    return false;
                }
            }
            return true;
        }
Пример #17
0
        internal ODataRouteBuilderContext(
            HttpConfiguration configuration,
            ApiVersion apiVersion,
            ODataRoute route,
            HttpActionDescriptor actionDescriptor,
            IList <ApiParameterDescription> parameterDescriptions,
            IModelTypeBuilder modelTypeBuilder,
            ODataApiExplorerOptions options)
        {
            this.route            = route;
            ApiVersion            = apiVersion;
            Services              = configuration.GetODataRootContainer(route);
            routeAttribute        = actionDescriptor.GetCustomAttributes <ODataRouteAttribute>().FirstOrDefault();
            RouteTemplate         = routeAttribute?.PathTemplate;
            RoutePrefix           = route.RoutePrefix?.Trim('/');
            ActionDescriptor      = actionDescriptor;
            ParameterDescriptions = parameterDescriptions;
            Options         = options;
            UrlKeyDelimiter = UrlKeyDelimiterOrDefault(configuration.GetUrlKeyDelimiter() ?? Services.GetService <IODataPathHandler>()?.UrlKeyDelimiter);

            var selector  = Services.GetRequiredService <IEdmModelSelector>();
            var model     = selector.SelectModel(apiVersion);
            var container = model?.EntityContainer;

            if (model == null || container == null)
            {
                EdmModel        = Services.GetRequiredService <IEdmModel>();
                IsRouteExcluded = true;
                return;
            }

            var controllerName = actionDescriptor.ControllerDescriptor.ControllerName;

            EdmModel        = model;
            Services        = new FixedEdmModelServiceProviderDecorator(Services, model);
            EntitySet       = container.FindEntitySet(controllerName);
            Singleton       = container.FindSingleton(controllerName);
            Operation       = ResolveOperation(container, actionDescriptor);
            ActionType      = GetActionType(actionDescriptor);
            IsRouteExcluded = ActionType == ODataRouteActionType.Unknown;

            if (Operation?.IsAction() == true)
            {
                ConvertODataActionParametersToTypedModel(modelTypeBuilder, (IEdmAction)Operation, controllerName);
            }
        }
        private static ODataActionDescriptor GetODataActionDescriptorFromAttributeRoute(HttpActionDescriptor actionDescriptor, ODataRoute oDataRoute,
                                                                                        HttpConfiguration httpConfig)
        {
            Contract.Requires(actionDescriptor != null);
            Contract.Requires(oDataRoute != null);
            Contract.Ensures(Contract.Result <ODataActionDescriptor>() != null);

            var odataRoutePrefixAttribute = actionDescriptor.ControllerDescriptor.GetCustomAttributes <ODataRoutePrefixAttribute>()?.FirstOrDefault();
            var odataRouteAttribute       = actionDescriptor.GetCustomAttributes <ODataRouteAttribute>()?.FirstOrDefault();

            Contract.Assume(odataRouteAttribute != null);
            var pathTemplate = HttpUtility.UrlDecode(oDataRoute.GetRoutePrefix().AppendUriSegment(GetODataPathTemplate(odataRoutePrefixAttribute?.Prefix, odataRouteAttribute.PathTemplate)));

            Contract.Assume(pathTemplate != null);

            return(new ODataActionDescriptor(actionDescriptor, oDataRoute, pathTemplate, CreateHttpRequestMessage(actionDescriptor, oDataRoute, httpConfig)));
        }
    private CustomAuthorizeAttribute GetAuthorizeAttribute(HttpActionDescriptor actionDescriptor)
    {
        // Check action level
        CustomAuthorizeAttribute result = actionDescriptor
                                          .GetCustomAttributes <CustomAuthorizeAttribute>()
                                          .FirstOrDefault();

        if (result != null)
        {
            return(result);
        }
        // Check class level
        result = actionDescriptor
                 .ControllerDescriptor
                 .GetCustomAttributes <CustomAuthorizeAttribute>()
                 .FirstOrDefault();
        return(result);
    }
Пример #20
0
        //Private

        #region # Controller/Action是否有某特性标签 —— bool HasAttr<T>(HttpActionDescriptor...
        /// <summary>
        /// Controller/Action是否有某特性标签
        /// </summary>
        /// <typeparam name="T">特性类型</typeparam>
        /// <param name="actionDescriptor">Action方法元数据</param>
        /// <returns>是否拥有该特性</returns>
        public bool HasAttr <T>(HttpActionDescriptor actionDescriptor) where T : Attribute
        {
            ICollection <T> actionAttributes = actionDescriptor.GetCustomAttributes <T>();

            if (actionAttributes.Any())
            {
                return(true);
            }

            ICollection <T> controllerAttributes = actionDescriptor.ControllerDescriptor.GetCustomAttributes <T>();

            if (controllerAttributes.Any())
            {
                return(true);
            }

            return(false);
        }
        /// <remarks>This signature uses types that are AspNet-specific.</remarks>
        private IEnumerable <ODataPathTemplate> GetODataPathTemplates(string prefix, HttpActionDescriptor action)
        {
            Contract.Assert(action != null);

            IEnumerable <ODataRouteAttribute> routeAttributes =
                action.GetCustomAttributes <ODataRouteAttribute>(inherit: false);

            IServiceProvider requestContainer = action.Configuration.GetODataRootContainer(_routeName);

            string controllerName = action.ControllerDescriptor.ControllerName;
            string actionName     = action.ActionName;

            return
                (routeAttributes
                 .Where(route => String.IsNullOrEmpty(route.RouteName) || route.RouteName == _routeName)
                 .Select(route => GetODataPathTemplate(prefix, route.PathTemplate, requestContainer, controllerName, actionName))
                 .Where(template => template != null));
        }
        public string GetResponseDocumentation(HttpActionDescriptor actionDescriptor)
        {
            var attr = actionDescriptor.GetCustomAttributes <RestResponseAttribute>().FirstOrDefault();

            if (attr != null)
            {
                return(attr.Description);
            }

            var returnInfo = GetMethod(actionDescriptor);

            if (returnInfo == null)
            {
                return(null);
            }

            return(returnInfo.ReturnTypeCustomAttributes.GetDescription());
        }
Пример #23
0
        private bool DescriptionAuthorized(HttpActionContext actionContext, HttpActionDescriptor actionDescriptor)
        {
            var attributes = actionDescriptor.GetCustomAttributes <Attribute>()
                             .ToArray();

            IEnumerable <ISwaggerAuthorization> swaggerAuthorization =
                attributes == null ? new List <ISwaggerAuthorization>() :
                attributes.Where(c => c as ISwaggerAuthorization != null).Cast <ISwaggerAuthorization>().ToList();

            foreach (var auth in swaggerAuthorization)
            {
                if (!auth.IsDescriptionAuthorized(actionContext))
                {
                    return(false);
                }
            }
            return(true);
        }
        /// <summary>
        /// Gets the documentation based on <see cref="T:System.Web.Http.Controllers.HttpActionDescriptor" />.
        /// </summary>
        /// <param name="actionDescriptor">The action descriptor.</param>
        /// <returns>The documentation for the action.</returns>
        public virtual string GetDocumentation(HttpActionDescriptor actionDescriptor)
        {
            var methodNode = this.GetMethodNode(actionDescriptor);

            var s = new List <string>
            {
                GetTagValueForAction(methodNode, "summary"),
                GetTagValueForAction(methodNode, "remarks")
            };

            // Add message if action requires authorization
            if (actionDescriptor.GetCustomAttributes <AuthorizeAttribute>().Any())
            {
                s.Add("<p><i class='fa fa-lock'></i> Requires authorization!</p>");
            }

            return(string.Join("", s.Where(x => !string.IsNullOrEmpty(x))));
        }
Пример #25
0
        public string GetDocumentation(HttpActionDescriptor actionDescriptor)
        {
            var descriptionAttributes      = actionDescriptor.GetCustomAttributes <DescriptionAttribute>();
            var descriptionAttributesCount = descriptionAttributes.Count;

            if (descriptionAttributesCount == 0)
            {
                return(string.Empty);
            }

            if (descriptionAttributesCount > 1)
            {
                throw new Exception();
            }

            var singleDescriptionAttribute = descriptionAttributes[0];

            return(singleDescriptionAttribute.Description);
        }
        private HttpActionDescriptor CreateBetaAction(HttpActionDescriptor originalAction)
        {
            var attributes = originalAction.GetCustomAttributes<HasBetaTestingActionAttribute>().OfType<HasBetaTestingActionAttribute>();
            if (!attributes.Any())
            {
                return null;
            }

            var methodName = attributes.First().MethodName;
            var actionMethod = originalAction.ControllerDescriptor.ControllerType.GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic);
            if (actionMethod == null)
            {
                return null;
            }
           
            var actionDescriptor = new ReflectedHttpActionDescriptor(originalAction.ControllerDescriptor, actionMethod);
            actionDescriptor.Properties.TryAdd("IsBetaAction", true);
            return actionDescriptor;
        }
        /// <summary>
        /// Applies the builder conventions to the specified controller action.
        /// </summary>
        /// <param name="actionDescriptor">The <see cref="HttpActionDescriptor">action descriptor</see>
        /// to apply the conventions to.</param>
        public void ApplyTo(HttpActionDescriptor actionDescriptor)
        {
            Arg.NotNull(actionDescriptor, nameof(actionDescriptor));

            mappedVersions.UnionWith(from provider in actionDescriptor.GetCustomAttributes <IApiVersionProvider>()
                                     where !provider.AdvertiseOnly && !provider.Deprecated
                                     from version in provider.Versions
                                     select version);

            var noVersions = Enumerable.Empty <ApiVersion>();
            var model      = new ApiVersionModel(
                apiVersionNeutral: false,
                supported: mappedVersions,
                deprecated: noVersions,
                advertised: noVersions,
                deprecatedAdvertised: noVersions);

            actionDescriptor.SetApiVersionModel(model);
        }
Пример #28
0
        protected override IReadOnlyList<IDirectRouteFactory> GetActionRouteFactories(
            HttpActionDescriptor actionDescriptor)
        {
            var a = new List<RouteAttribute>();

            var ret = actionDescriptor.GetCustomAttributes<IDirectRouteFactory>(true);

            foreach (var item in ret)
            {
                string routeprefix = null;

                var attribute = item as RouteAttribute;

                if (attribute == null) continue;

                var subRoute = attribute.Template;

                var method = actionDescriptor.SupportedHttpMethods[0].Method;

                var attribs = actionDescriptor.ControllerDescriptor.ControllerType.CustomAttributes.ToList();

                foreach (var attrib in attribs.Where(attrib => attrib.AttributeType == typeof(RoutePrefixAttribute)))
                    routeprefix = attrib.ConstructorArguments[0].Value.ToString();

                var key = routeprefix + "/" + subRoute;

                if (!Routes.ContainsKey(key))
                {
                    Routes.Add(key, new RouteInfo
                    {
                        Class = actionDescriptor.ControllerDescriptor.ControllerType.FullName,
                        Method = method
                    });
                }
                else
                {
                    Routes[key].Method += " " + method;
                }
            }

            return ret;
        }
Пример #29
0
        internal static Type GetElementType(HttpActionDescriptor actionDescriptor)
        {
            Type returnType = actionDescriptor.ReturnType;

            if (returnType == typeof(HttpResponseMessage) || typeof(IHttpActionResult).IsAssignableFrom(actionDescriptor.ReturnType))
            {
                ResponseTypeAttribute responseType = actionDescriptor.GetCustomAttributes <ResponseTypeAttribute>(inherit: true).FirstOrDefault();
                if (responseType != null)
                {
                    returnType = responseType.ResponseType;
                }
            }

            if (returnType != null)
            {
                return(returnType.GetEnumerableElementType());
            }

            return(null);
        }
Пример #30
0
        public IEnumerable <FilterInfo> GetFilters(
            HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
        {
            // Taken from ActionDescriptorFilterProvider
            var controllerFilters
                = GetFilterInfos(actionDescriptor.ControllerDescriptor.GetFilters(), FilterScope.Controller);
            var actionFilters
                = GetFilterInfos(actionDescriptor.GetFilters(), FilterScope.Action);
            // Taken from ActionDescriptorFilterProvider

            var controllerProxiedFilters
                = GetFilterInfos(actionDescriptor.ControllerDescriptor.GetCustomAttributes <IServiceAttribute>(),
                                 FilterScope.Controller);
            var actionProxiedFilters
                = GetFilterInfos(actionDescriptor.GetCustomAttributes <IServiceAttribute>(), FilterScope.Action);

            return(controllerFilters
                   .Concat(controllerProxiedFilters)
                   .Concat(actionFilters)
                   .Concat(actionProxiedFilters));
        }
        public IEnumerable<FilterInfo> GetFilters(
            HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
        {
            // Taken from ActionDescriptorFilterProvider
            var controllerFilters
                = GetFilterInfos(actionDescriptor.ControllerDescriptor.GetFilters(), FilterScope.Controller);
            var actionFilters
                = GetFilterInfos(actionDescriptor.GetFilters(), FilterScope.Action);
            // Taken from ActionDescriptorFilterProvider

            var controllerProxiedFilters
                = GetFilterInfos(actionDescriptor.ControllerDescriptor.GetCustomAttributes<IServiceAttribute>(),
                                 FilterScope.Controller);
            var actionProxiedFilters
                = GetFilterInfos(actionDescriptor.GetCustomAttributes<IServiceAttribute>(), FilterScope.Action);

            return controllerFilters
                .Concat(controllerProxiedFilters)
                .Concat(actionFilters)
                .Concat(actionProxiedFilters);
        }
        private ICorsPolicyProvider GetCorsPolicyProvider(HttpActionDescriptor actionDescriptor)
        {
            ICorsPolicyProvider policyProvider = null;

            if (actionDescriptor != null)
            {
                HttpControllerDescriptor controllerDescriptor = actionDescriptor.ControllerDescriptor;
                policyProvider = actionDescriptor.GetCustomAttributes <ICorsPolicyProvider>().FirstOrDefault();
                if (policyProvider == null && controllerDescriptor != null)
                {
                    policyProvider = controllerDescriptor.GetCustomAttributes <ICorsPolicyProvider>().FirstOrDefault();
                }
            }

            if (policyProvider == null)
            {
                policyProvider = DefaultPolicyProvider;
            }

            return(policyProvider);
        }
Пример #33
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ApiVersionModel"/> class.
        /// </summary>
        /// <param name="actionDescriptor">The <see cref="HttpActionDescriptor"/> to initialize the API version model from.</param>
        public ApiVersionModel(HttpActionDescriptor actionDescriptor)
        {
            Arg.NotNull(actionDescriptor, nameof(actionDescriptor));

            var controllerModel = actionDescriptor.ControllerDescriptor.GetApiVersionModel();

            if (IsApiVersionNeutral = controllerModel.IsApiVersionNeutral)
            {
                declaredVersions    = emptyVersions;
                implementedVersions = emptyVersions;
                supportedVersions   = emptyVersions;
                deprecatedVersions  = emptyVersions;
            }
            else
            {
                declaredVersions    = new Lazy <IReadOnlyList <ApiVersion> >(actionDescriptor.GetCustomAttributes <IApiVersionProvider>(false).GetImplementedApiVersions);
                implementedVersions = new Lazy <IReadOnlyList <ApiVersion> >(() => controllerModel.ImplementedApiVersions);
                supportedVersions   = new Lazy <IReadOnlyList <ApiVersion> >(() => controllerModel.SupportedApiVersions);
                deprecatedVersions  = new Lazy <IReadOnlyList <ApiVersion> >(() => controllerModel.DeprecatedApiVersions);
            }
        }
Пример #34
0
        private HttpActionDescriptor CreateBetaAction(HttpActionDescriptor originalAction)
        {
            var attributes = originalAction.GetCustomAttributes <HasBetaTestingActionAttribute>().OfType <HasBetaTestingActionAttribute>();

            if (!attributes.Any())
            {
                return(null);
            }

            var methodName   = attributes.First().MethodName;
            var actionMethod = originalAction.ControllerDescriptor.ControllerType.GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic);

            if (actionMethod == null)
            {
                return(null);
            }

            var actionDescriptor = new ReflectedHttpActionDescriptor(originalAction.ControllerDescriptor, actionMethod);

            actionDescriptor.Properties.TryAdd("IsBetaAction", true);
            return(actionDescriptor);
        }
Пример #35
0
        public override object Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext)
        {
            HttpActionDescriptor actionDescriptor = readContext.Request.GetActionDescriptor();

            if (actionDescriptor != null && !actionDescriptor.GetCustomAttributes <ActionAttribute>().Any())
            {
                throw new InvalidOperationException($"{nameof(DefaultODataActionParameterDeserializer)} is designed for odata actions only");
            }

            TypeInfo typeInfo = type.GetTypeInfo();

            IDependencyResolver dependencyResolver = readContext.Request.GetOwinContext()
                                                     .GetDependencyResolver();

            ITimeZoneManager timeZoneManager = dependencyResolver.Resolve <ITimeZoneManager>();

            using (StreamReader requestStreamReader = new StreamReader(readContext.Request.Content.ReadAsStreamAsync().GetAwaiter().GetResult()))
            {
                using (JsonTextReader requestJsonReader = new JsonTextReader(requestStreamReader))
                {
                    JsonSerializer deserilizer = JsonSerializer.Create(new JsonSerializerSettings
                    {
                        ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
                        DateFormatHandling    = DateFormatHandling.IsoDateFormat,
                        Converters            = new JsonConverter[]
                        {
                            _odataJsonDeserializerEnumConverter,
                            _stringFormatterConvert,
                            new ODataJsonDeSerializerDateTimeOffsetTimeZone(timeZoneManager)
                        }
                    });

                    object result = deserilizer.Deserialize(requestJsonReader, typeInfo);

                    return(result);
                }
            }
        }
Пример #36
0
        public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
        {
            #region Allow anonymous
            HttpActionDescriptor actionDescriptor = context.ActionContext.ActionDescriptor;
            bool isAnonymousAllowed = actionDescriptor.GetCustomAttributes <AllowAnonymousAttribute>(true).Any() || actionDescriptor.ControllerDescriptor.GetCustomAttributes <AllowAnonymousAttribute>(true).Any();
            if (isAnonymousAllowed)
            {
                return;
            }
            #endregion

            #region Identity authentication
            context.Principal = null;

            // Look for credentials in the request.
            AuthenticationHeaderValue authenticationHeader = context.Request.Headers.Authorization;

            // If there are no credentials, do nothing.
            // If there are credentials but the filter does not recognize the authentication scheme, do nothing.
            if (authenticationHeader != null && authenticationHeader.Scheme == "Basic")
            {
                // If there are credentials that the filter understands, try to validate them.
                // If the credentials are bad, set the error result.
                if (!string.IsNullOrEmpty(authenticationHeader.Parameter))
                {
                    Tuple <string, string> data = ExtractUserNameAndPassword(authenticationHeader.Parameter);

                    // If the credentials are valid, set principal.
                    context.Principal = await AuthenticateAsync(data?.Item1, data?.Item2, cancellationToken);
                }
            }

            if (context.Principal == null)
            {
                context.ErrorResult = new UnauthorizedResult(new[] { new AuthenticationHeaderValue("Basic") }, context.Request);
            }
            #endregion
        }
Пример #37
0
        /// <summary>
        /// Determines whether the action should be considered.
        /// </summary>
        /// <param name="actionRouteParameterValue">The action route parameter value.</param>
        /// <param name="actionDescriptor">The associated <see cref="HttpActionDescriptor">action descriptor</see>.</param>
        /// <param name="route">The associated <see cref="IHttpRoute">route</see>.</param>
        /// <param name="apiVersion">The <see cref="ApiVersion">API version</see> to consider the controller for.</param>
        /// <returns>True if the action should be explored; otherwise, false.</returns>
        protected override bool ShouldExploreAction(string actionRouteParameterValue, HttpActionDescriptor actionDescriptor, IHttpRoute route, ApiVersion apiVersion)
        {
            Arg.NotNull(actionDescriptor, nameof(actionDescriptor));
            Arg.NotNull(route, nameof(route));
            Arg.NotNull(apiVersion, nameof(apiVersion));

            if (!(route is ODataRoute))
            {
                return(base.ShouldExploreAction(actionRouteParameterValue, actionDescriptor, route, apiVersion));
            }

            if (Options.UseApiExplorerSettings)
            {
                var setting = actionDescriptor.GetCustomAttributes <ApiExplorerSettingsAttribute>().FirstOrDefault();

                if (setting?.IgnoreApi == true)
                {
                    return(false);
                }
            }

            return(actionDescriptor.IsMappedTo(apiVersion));
        }
        private static int GetVersion(HttpActionDescriptor actionDescriptor)
        {
            int version = 1;

            var controllerAttribute = actionDescriptor.ControllerDescriptor
                                      .GetCustomAttributes <VersionedRoutePrefixAttribute>(false)
                                      .FirstOrDefault();

            if (controllerAttribute != null)
            {
                version = controllerAttribute.Version;
            }

            var actionAttribute = actionDescriptor.GetCustomAttributes <VersionedRouteAttribute>(false)
                                  .FirstOrDefault();

            if (actionAttribute != null && actionAttribute.Version != NO_VERSION)
            {
                version = actionAttribute.Version;
            }

            return(version);
        }
        /// <summary>
        /// Determines whether the action should be considered.
        /// </summary>
        /// <param name="actionRouteParameterValue">The action route parameter value.</param>
        /// <param name="actionDescriptor">The associated <see cref="HttpActionDescriptor">action descriptor</see>.</param>
        /// <param name="route">The associated <see cref="IHttpRoute">route</see>.</param>
        /// <param name="apiVersion">The <see cref="ApiVersion">API version</see> to consider the controller for.</param>
        /// <returns>True if the action should be explored; otherwise, false.</returns>
        protected override bool ShouldExploreAction(string actionRouteParameterValue, HttpActionDescriptor actionDescriptor, IHttpRoute route, ApiVersion apiVersion)
        {
            Arg.NotNull(actionDescriptor, nameof(actionDescriptor));
            Arg.NotNull(route, nameof(route));
            Arg.NotNull(apiVersion, nameof(apiVersion));

            if (!(route is ODataRoute))
            {
                return(base.ShouldExploreAction(actionRouteParameterValue, actionDescriptor, route, apiVersion));
            }

            if (Options.UseApiExplorerSettings)
            {
                var setting = actionDescriptor.GetCustomAttributes <ApiExplorerSettingsAttribute>().FirstOrDefault();

                if (setting?.IgnoreApi == true)
                {
                    return(false);
                }
            }

            var model = actionDescriptor.GetApiVersionModel();

            if (model.IsApiVersionNeutral || model.DeclaredApiVersions.Contains(apiVersion))
            {
                return(true);
            }

            if (model.DeclaredApiVersions.Count == 0)
            {
                model = actionDescriptor.ControllerDescriptor.GetApiVersionModel();
                return(model.IsApiVersionNeutral || model.DeclaredApiVersions.Contains(apiVersion));
            }

            return(false);
        }
Пример #40
0
        private static string GetXPathFor(HttpActionDescriptor actionDescriptor)
        {
            var controllerName = actionDescriptor.ControllerDescriptor.ControllerType.FullName;
            var actionName     = actionDescriptor.ActionName;

            if (actionDescriptor.GetCustomAttributes <ActionNameAttribute>().Any())
            {
                var reflected = actionDescriptor as ReflectedHttpActionDescriptor;
                if (reflected != null)
                {
                    actionName = reflected.MethodInfo.Name;
                }
            }

            var paramTypeNames = actionDescriptor.GetParameters()
                                 .Select(paramDesc => TypeNameFor(paramDesc.ParameterType))
                                 .ToArray();

            var parameters = (paramTypeNames.Any())
                ? String.Format("({0})", String.Join(",", paramTypeNames))
                : String.Empty;

            return(String.Format(MethodExpression, controllerName, actionName, parameters));
        }
Пример #41
0
 public string GetDocumentation(HttpActionDescriptor actionDescriptor)
 {
     var attr = actionDescriptor.GetCustomAttributes<ApiDocAttribute>().FirstOrDefault();
     return attr != null ? attr.Documentation : "";
 }
Пример #42
0
 GetActionRouteFactories(HttpActionDescriptor actionDescriptor)
 {
     return(actionDescriptor.GetCustomAttributes <IDirectRouteFactory>(inherit: true));
 }
Пример #43
0
 GetActionRouteFactories(HttpActionDescriptor actionDescriptor)
 {
     return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>
     (inherit: true);
 }
Пример #44
0
        public override object Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext)
        {
            HttpActionDescriptor actionDescriptor = readContext.Request.GetActionDescriptor();

            if (actionDescriptor != null && !actionDescriptor.GetCustomAttributes <ActionAttribute>().Any() && !actionDescriptor.GetCustomAttributes <CreateAttribute>().Any() && !actionDescriptor.GetCustomAttributes <UpdateAttribute>().Any())
            {
                throw new InvalidOperationException($"{nameof(DefaultODataActionCreateUpdateParameterDeserializer)} is designed for odata actions|creates|updates only");
            }

            TypeInfo typeInfo = type.GetTypeInfo();

            IDependencyResolver dependencyResolver = readContext.Request.GetOwinContext()
                                                     .GetDependencyResolver();

            ITimeZoneManager timeZoneManager = dependencyResolver.Resolve <ITimeZoneManager>();

            using (StreamReader requestStreamReader = new StreamReader(readContext.Request.Content.ReadAsStreamAsync().GetAwaiter().GetResult()))
            {
                using (JsonTextReader requestJsonReader = new JsonTextReader(requestStreamReader))
                {
                    void Error(object sender, Newtonsoft.Json.Serialization.ErrorEventArgs e)
                    {
                        if (e.ErrorContext.Error is JsonSerializationException && e.ErrorContext.Error.Message.StartsWith("Could not find member "))
                        {
                            if (e.CurrentObject is IOpenType openDto)
                            {
                                openDto.Properties = openDto.Properties ?? new Dictionary <string, object>();
                                if (requestJsonReader.Read())
                                {
                                    openDto.Properties.Add((string)e.ErrorContext.Member, requestJsonReader.Value);
                                }
                            }

                            e.ErrorContext.Handled = true;
                        }
                    }

                    JsonSerializerSettings settings = DefaultJsonContentFormatter.DeSerializeSettings();

                    settings.Converters = new JsonConverter[]
                    {
                        _odataJsonDeserializerEnumConverter,
                        _stringFormatterConvert,
                        new ODataJsonDeSerializerDateTimeOffsetTimeZone(timeZoneManager)
                    };

                    settings.MissingMemberHandling = MissingMemberHandling.Error;

                    JsonSerializer deserilizer = JsonSerializer.Create(settings);

                    deserilizer.Error += Error;

                    try
                    {
                        object result = deserilizer.Deserialize(requestJsonReader, typeInfo);

                        return(result);
                    }
                    finally
                    {
                        deserilizer.Error -= Error;
                    }
                }
            }
        }
        /// <summary>
        /// Determines whether the action should be considered for <see cref="ApiExplorer.ApiDescriptions"/> generation. Called when initializing the <see cref="ApiExplorer.ApiDescriptions"/>.
        /// </summary>
        /// <param name="actionVariableValue">The action variable value from the route.</param>
        /// <param name="actionDescriptor">The action descriptor.</param>
        /// <param name="route">The route.</param>
        /// <returns><c>true</c> if the action should be considered for <see cref="ApiExplorer.ApiDescriptions"/> generation, <c>false</c> otherwise.</returns>
        public virtual bool ShouldExploreAction(string actionVariableValue, HttpActionDescriptor actionDescriptor, IHttpRoute route)
        {
            if (actionDescriptor == null)
            {
                throw Error.ArgumentNull("actionDescriptor");
            }

            if (route == null)
            {
                throw Error.ArgumentNull("route");
            }

            ApiExplorerSettingsAttribute setting = actionDescriptor.GetCustomAttributes<ApiExplorerSettingsAttribute>().FirstOrDefault();
            NonActionAttribute nonAction = actionDescriptor.GetCustomAttributes<NonActionAttribute>().FirstOrDefault();
            return (setting == null || !setting.IgnoreApi) &&
                (nonAction == null) &&
                MatchRegexConstraint(route, ActionVariableName, actionVariableValue);
        }
Пример #46
0
        public string GetDocumentation(HttpActionDescriptor actionDescriptor)
        {
            var attr = actionDescriptor.GetCustomAttributes <ApiDocAttribute>().FirstOrDefault();

            return(attr != null ? attr.Documentation : "");
        }
        /// <summary>
        /// Gets a set of route factories for the given action descriptor.
        /// </summary>
        /// <param name="actionDescriptor">The action descriptor.</param>
        /// <returns>A set of route factories.</returns>
        /// <remarks>
        /// The implementation returns <see cref="IDirectRouteFactory"/> instances based on attributes on the action. Returns
        /// null if the action was defined on a base class of this controller.
        /// </remarks>
        protected virtual IReadOnlyList<IDirectRouteFactory> GetActionRouteFactories(HttpActionDescriptor actionDescriptor)
        {
            // Ignore the Route attributes from inherited actions.
            ReflectedHttpActionDescriptor reflectedActionDescriptor = actionDescriptor as ReflectedHttpActionDescriptor;
            if (reflectedActionDescriptor != null &&
                reflectedActionDescriptor.MethodInfo != null &&
                reflectedActionDescriptor.MethodInfo.DeclaringType != actionDescriptor.ControllerDescriptor.ControllerType)
            {
                return null;
            }

            Collection<IDirectRouteFactory> newFactories = actionDescriptor.GetCustomAttributes<IDirectRouteFactory>(inherit: false);

            Collection<IHttpRouteInfoProvider> oldProviders = actionDescriptor.GetCustomAttributes<IHttpRouteInfoProvider>(inherit: false);

            List<IDirectRouteFactory> combined = new List<IDirectRouteFactory>();
            combined.AddRange(newFactories);

            foreach (IHttpRouteInfoProvider oldProvider in oldProviders)
            {
                if (oldProvider is IDirectRouteFactory)
                {
                    continue;
                }

                combined.Add(new RouteInfoDirectRouteFactory(oldProvider));
            }

            return combined;
        }
        internal static Type GetElementType(HttpActionDescriptor actionDescriptor)
        {
            Type returnType = actionDescriptor.ReturnType;
            if (returnType == typeof(HttpResponseMessage) || typeof(IHttpActionResult).IsAssignableFrom(actionDescriptor.ReturnType))
            {
                ResponseTypeAttribute responseType = actionDescriptor.GetCustomAttributes<ResponseTypeAttribute>(inherit: true).FirstOrDefault();
                if (responseType != null)
                {
                    returnType = responseType.ResponseType;
                }
            }

            if (returnType != null)
            {
                return returnType.GetEnumerableElementType();
            }

            return null;
        }
        private ICorsPolicyProvider GetCorsPolicyProvider(HttpActionDescriptor actionDescriptor)
        {
            ICorsPolicyProvider policyProvider = null;
            if (actionDescriptor != null)
            {
                HttpControllerDescriptor controllerDescriptor = actionDescriptor.ControllerDescriptor;
                policyProvider = actionDescriptor.GetCustomAttributes<ICorsPolicyProvider>().FirstOrDefault();
                if (policyProvider == null && controllerDescriptor != null)
                {
                    policyProvider = controllerDescriptor.GetCustomAttributes<ICorsPolicyProvider>().FirstOrDefault();
                }
            }

            if (policyProvider == null)
            {
                policyProvider = DefaultPolicyProvider;
            }

            return policyProvider;
        }
 protected override IReadOnlyList<IDirectRouteFactory> GetActionRouteFactories(HttpActionDescriptor actionDescriptor)
 {
     return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>(inherit: true);
 }
Пример #51
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="descriptor"></param>
 /// <returns></returns>
 private IEnumerable <WebAPIAuthorize> GetApiAuthorizeAttributes(HttpActionDescriptor descriptor)
 {
     return(descriptor.GetCustomAttributes <WebAPIAuthorize>(true)
            .Concat(descriptor.ControllerDescriptor.GetCustomAttributes <WebAPIAuthorize>(true)));
 }
 private ResponseDescription CreateResponseDescription(HttpActionDescriptor actionDescriptor)
 {
     Type type = (
         from attribute in actionDescriptor.GetCustomAttributes<ResponseTypeAttribute>()
         select attribute.ResponseType).FirstOrDefault<Type>();
     ResponseDescription responseDescription = new ResponseDescription()
     {
         DeclaredType = actionDescriptor.ReturnType,
         ResponseType = type,
         Documentation = this.GetApiResponseDocumentation(actionDescriptor)
     };
     return responseDescription;
 }
        public string GetDocumentation(HttpActionDescriptor actionDescriptor)
        {
            var actionDescriptionAttributes = actionDescriptor.GetCustomAttributes<DescriptionAttribute>();

            return actionDescriptionAttributes.First().Description;
        }
Пример #54
0
 protected override IReadOnlyList <IDirectRouteFactory> GetActionRouteFactories(
     HttpActionDescriptor actionDescriptor)
 {
     return(actionDescriptor.GetCustomAttributes <IDirectRouteFactory>(inherit: true));
 }
Пример #55
0
 /// <summary>
 /// Gets a set of route factories for the given action descriptor.
 /// </summary>
 /// <returns>
 /// A set of route factories.
 /// </returns>
 /// <param name="actionDescriptor">The action descriptor.</param>
 protected override IReadOnlyList<IDirectRouteFactory> GetActionRouteFactories(HttpActionDescriptor actionDescriptor)
 {
     // inherit route attributes decorated on base class controller's actions
     return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>(inherit: true);
 }
Пример #56
0
        private ResponseDescription CreateResponseDescription(HttpActionDescriptor actionDescriptor)
        {
            Collection<ResponseTypeAttribute> responseTypeAttribute = actionDescriptor.GetCustomAttributes<ResponseTypeAttribute>();
            Type responseType = responseTypeAttribute.Select(attribute => attribute.ResponseType).FirstOrDefault();

            return new ResponseDescription
            {
                DeclaredType = actionDescriptor.ReturnType,
                ResponseType = responseType,
                Documentation = GetApiResponseDocumentation(actionDescriptor)
            };
        }
 IEnumerable<SupraterraAuthorizeAttribute> GetApiAuthorizeAttributes(HttpActionDescriptor descriptor)
 {
     return descriptor.GetCustomAttributes<SupraterraAuthorizeAttribute>(true)
         .Concat(descriptor.ControllerDescriptor.GetCustomAttributes<SupraterraAuthorizeAttribute>(true));
 }
        public override object Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext)
        {
            HttpActionDescriptor actionDescriptor = readContext.Request.GetActionDescriptor();

            if (actionDescriptor != null && !actionDescriptor.GetCustomAttributes <ActionAttribute>().Any() && !actionDescriptor.GetCustomAttributes <CreateAttribute>().Any() && !actionDescriptor.GetCustomAttributes <UpdateAttribute>().Any() && !actionDescriptor.GetCustomAttributes <PartialUpdateAttribute>().Any())
            {
                throw new InvalidOperationException($"{nameof(DefaultODataActionCreateUpdateParameterDeserializer)} is designed for odata actions|creates|updates|partialUpdates only");
            }

            TypeInfo typeInfo = type.GetTypeInfo();

            IDependencyResolver dependencyResolver = readContext.Request.GetOwinContext()
                                                     .GetDependencyResolver();

            ITimeZoneManager timeZoneManager = dependencyResolver.Resolve <ITimeZoneManager>();

            string requestJsonBody = (string)readContext.Request.Properties["ContentStreamAsJson"];

            using (StringReader jsonStringReader = new StringReader(requestJsonBody))
                using (JsonTextReader requestJsonReader = new JsonTextReader(jsonStringReader))
                {
                    void Error(object sender, Newtonsoft.Json.Serialization.ErrorEventArgs e)
                    {
                        if (e.ErrorContext.Error is JsonSerializationException && e.ErrorContext.Error.Message.StartsWith("Could not find member ", StringComparison.InvariantCultureIgnoreCase))
                        {
                            if (e.CurrentObject is IOpenType openDto)
                            {
                                openDto.Properties = openDto.Properties ?? new Dictionary <string, object>();
                                if (requestJsonReader.Read())
                                {
                                    openDto.Properties.Add((string)e.ErrorContext.Member, requestJsonReader.Value);
                                }
                            }

                            e.ErrorContext.Handled = true;
                        }
                    }

                    JsonSerializerSettings settings = DefaultJsonContentFormatter.DeSerializeSettings();

                    settings.Converters = new JsonConverter[]
                    {
                        _odataJsonDeserializerEnumConverter,
                        _stringCorrectorsConverters,
                        new ODataJsonDeSerializerDateTimeOffsetTimeZone(timeZoneManager)
                    };

                    settings.MissingMemberHandling = MissingMemberHandling.Error;

                    JsonSerializer deserilizer = JsonSerializer.Create(settings);

                    deserilizer.Error += Error;

                    try
                    {
                        object result = null;

                        if (!typeof(Delta).GetTypeInfo().IsAssignableFrom(typeInfo))
                        {
                            result = deserilizer.Deserialize(requestJsonReader, typeInfo);
                        }
                        else
                        {
                            List <string> changedPropNames = new List <string>();

                            using (JsonTextReader jsonReaderForGettingSchema = new JsonTextReader(new StringReader(requestJsonBody)))
                            {
                                while (jsonReaderForGettingSchema.Read())
                                {
                                    if (jsonReaderForGettingSchema.Value != null && jsonReaderForGettingSchema.TokenType == JsonToken.PropertyName)
                                    {
                                        changedPropNames.Add(jsonReaderForGettingSchema.Value.ToString());
                                    }
                                    else
                                    {
                                    }
                                }
                            }

                            TypeInfo dtoType = typeInfo.GetGenericArguments().ExtendedSingle("Finding dto type from delta").GetTypeInfo();

                            object modifiedDto = deserilizer.Deserialize(requestJsonReader, dtoType);

                            Delta delta = (Delta)Activator.CreateInstance(typeInfo);

                            if (modifiedDto is IOpenType openTypeDto && openTypeDto.Properties?.Any() == true)
                            {
                                delta.TrySetPropertyValue(nameof(IOpenType.Properties), openTypeDto);
                            }

                            foreach (string changedProp in changedPropNames.Where(p => p != nameof(IOpenType.Properties) && dtoType.GetProperty(p) != null))
                            {
                                delta.TrySetPropertyValue(changedProp, dtoType.GetProperty(changedProp).GetValue(modifiedDto));
                            }

                            result = delta;
                        }

                        return(result);
                    }
                    finally
                    {
                        deserilizer.Error -= Error;
                    }
                }
        }
Пример #59
0
 GetActionRouteFactories(HttpActionDescriptor actionDescriptor)
 {
     // inherit route attributes decorated on base class controller's actions
     return(actionDescriptor.GetCustomAttributes <IDirectRouteFactory>
                (inherit: true));
 }
        private IEnumerable<ODataPathTemplate> GetODataPathTemplates(string prefix, HttpActionDescriptor action)
        {
            Contract.Assert(action != null);

            IEnumerable<ODataRouteAttribute> routeAttributes = action.GetCustomAttributes<ODataRouteAttribute>(inherit: false);
            return
                routeAttributes
                .Select(route => GetODataPathTemplate(prefix, route.PathTemplate, action))
                .Where(template => template != null);
        }