Esempio n. 1
0
        public void Apply(Operation operation, OperationFilterContext context)
        {
            if (operation.Parameters == null)
            {
                return;
            }

            var formFileParams = context.ApiDescription.ActionDescriptor.Parameters
                                 .Where(x => TypeExtensions.IsAssignableFrom(x.ParameterType, typeof(IFormFile)))
                                 .Select(x => x.Name)
                                 .ToList();;

            var formFileSubParams = context.ApiDescription.ActionDescriptor.Parameters
                                    .SelectMany(x => x.ParameterType.GetProperties())
                                    .Where(x => x.PropertyType.IsAssignableFrom(typeof(IFormFile)))
                                    .Select(x => x.Name)
                                    .ToList();

            var allFileParamNames = formFileParams.Union(formFileSubParams);


            if (!allFileParamNames.Any())
            {
                return;
            }

            var paramsToRemove = new List <IParameter>();

            foreach (var param in operation.Parameters)
            {
                paramsToRemove.AddRange(from fileParamName in allFileParamNames where param.Name.StartsWith(fileParamName + ".") select param);
            }
            paramsToRemove.ForEach(x => operation.Parameters.Remove(x));
            foreach (var paramName in allFileParamNames)
            {
                var fileParam = new NonBodyParameter
                {
                    Type = "file",
                    Name = paramName,
                    In   = "formData"
                };
                operation.Parameters.Add(fileParam);
            }

            operation.Consumes = new List <string>()
            {
                "multipart/form-data"
            };
        }