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; }
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; }
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); }
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) }; }
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); } }
/// <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)); }
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; }
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); }
//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()); }
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)))); }
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); }
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; }
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); }
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); }
/// <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); } }
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); }
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); } } }
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 }
/// <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); }
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)); }
public string GetDocumentation(HttpActionDescriptor actionDescriptor) { var attr = actionDescriptor.GetCustomAttributes<ApiDocAttribute>().FirstOrDefault(); return attr != null ? attr.Documentation : ""; }
GetActionRouteFactories(HttpActionDescriptor actionDescriptor) { return(actionDescriptor.GetCustomAttributes <IDirectRouteFactory>(inherit: true)); }
GetActionRouteFactories(HttpActionDescriptor actionDescriptor) { return actionDescriptor.GetCustomAttributes<IDirectRouteFactory> (inherit: 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()) { 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); }
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); }
/// <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; }
protected override IReadOnlyList <IDirectRouteFactory> GetActionRouteFactories( HttpActionDescriptor actionDescriptor) { return(actionDescriptor.GetCustomAttributes <IDirectRouteFactory>(inherit: true)); }
/// <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); }
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; } } }
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); }