Ejemplo n.º 1
0
        /// <summary>
        /// 绑定路由参数到模版
        /// </summary>
        /// <param name="template">路由模版</param>
        /// <param name="parameter">参数</param>
        /// <returns></returns>
        private string GetPathQuery(string template, ApiParameterDescriptor parameter)
        {
            var _params = new RouteValueDictionary();

            if (parameter.IsUriParameterType)
            {
                _params.Add(parameter.Name, string.Format(CultureInfo.InvariantCulture, "{0}", parameter.Value));
            }
            else if (parameter.ParameterType.IsArray && parameter.Value is Array array)
            {
                foreach (var item in array)
                {
                    _params.Add(parameter.Name, string.Format(CultureInfo.InvariantCulture, "{0}", item));
                }
            }
            else
            {
                var instance     = parameter.Value;
                var instanceType = parameter.ParameterType;

                var properties = Property.GetProperties(instanceType);
                foreach (var p in properties)
                {
                    var value = instance == null ? null : p.GetValue(instance);
                    _params.Add(p.Name, string.Format(CultureInfo.InvariantCulture, "{0}", value));
                }
            }

            return(BoundTemplate(template, _params));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 生成数组的表单内容
        /// </summary>
        /// <param name="parameter">参数</param>
        /// <param name="encoding">编码</param>
        /// <returns></returns>
        private string GetContentArray(ApiParameterDescriptor parameter, Encoding encoding)
        {
            if (!(parameter.Value is Array array))
            {
                return(null);
            }

            var keyValues = array.Cast <object>().Select(item => this.GetContentSimple(parameter.Name, item, encoding));

            return(string.Join("&", keyValues));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 获取http请求内容
        /// </summary>
        /// <param name="context">上下文</param>
        /// <param name="parameter">特性关联的参数</param>
        /// <returns></returns>
        protected override HttpContent GetHttpContent(ApiActionContext context, ApiParameterDescriptor parameter)
        {
            var xmlSerializer = new XmlSerializer(parameter.ParameterType);

            using (var stream = new MemoryStream())
            {
                xmlSerializer.Serialize(stream, parameter.Value);
                var xml = Encoding.UTF8.GetString(stream.ToArray());
                return(new StringContent(xml, Encoding.UTF8, "application/xml"));
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// http请求之前
        /// </summary>
        /// <param name="context">上下文</param>
        /// <param name="parameter">特性关联的参数</param>
        /// <returns></returns>
        public override async Task BeforeRequestAsync(ApiActionContext context, ApiParameterDescriptor parameter)
        {
            if (this.IgnoreWhenNull && parameter.Value == null)
            {
                return;
            }
            var uri       = context.RequestMessage.RequestUri;
            var baseUrl   = uri.Scheme + "://" + uri.Host + (uri.IsDefaultPort ? "" : ":" + uri.Port);
            var pathQuery = GetPathQuery(uri.LocalPath.Trim('/'), parameter);

            context.RequestMessage.RequestUri = new Uri(new Uri(baseUrl), pathQuery);
            await TaskExtensions.CompletedTask;
        }
Ejemplo n.º 5
0
        /// <summary>
        /// http请求之前
        /// </summary>
        /// <param name="context">上下文</param>
        /// <param name="parameter">特性关联的参数</param>
        /// <returns></returns>
        public override async Task BeforeRequestAsync(ApiActionContext context, ApiParameterDescriptor parameter)
        {
            if (this.IgnoreWhenNull && parameter.Value == null)
            {
                return;
            }

            var uri       = context.RequestMessage.RequestUri;
            var pathQuery = this.GetPathQuery(uri.LocalPath + uri.Query, parameter);

            context.RequestMessage.RequestUri = new Uri(uri, pathQuery);
            await TaskExtensions.CompletedTask;
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 生成复杂类型的表单内容
        /// </summary>
        /// <param name="parameter">参数</param>
        /// <param name="encoding">编码</param>
        /// <returns></returns>
        private string GetContentComplex(ApiParameterDescriptor parameter, Encoding encoding)
        {
            var instance  = parameter.Value;
            var keyValues = Property
                            .GetProperties(parameter.ParameterType)
                            .Select(p =>
            {
                var value = instance == null ? null : p.GetValue(instance);
                return(this.GetContentSimple(p.Name, value, encoding));
            });

            return(string.Join("&", keyValues));
        }
Ejemplo n.º 7
0
        /// <summary>
        /// 生成表单内容
        /// key1=value1&key2=value2
        /// </summary>
        /// <param name="parameter">参数</param>
        /// <param name="encoding">编码</param>
        /// <returns></returns>
        protected virtual string GetFormContent(ApiParameterDescriptor parameter, Encoding encoding)
        {
            if (parameter.IsSimpleType == true)
            {
                return(this.GetContentSimple(parameter.Name, parameter.Value, encoding));
            }
            else if (parameter.ParameterType.IsArray == true)
            {
                return(this.GetContentArray(parameter, encoding));
            }

            return(this.GetContentComplex(parameter, encoding));
        }
Ejemplo n.º 8
0
        /// <summary>
        /// 获取新的Path与Query
        /// </summary>
        /// <param name="pathQuery">原始path与query</param>
        /// <param name="parameter">特性关联的参数</param>
        /// <returns></returns>
        private string GetPathQuery(string pathQuery, ApiParameterDescriptor parameter)
        {
            if (parameter.IsSimpleType == true)
            {
                return(this.GetPathQuerySimple(pathQuery, parameter.Name, parameter.Value));
            }

            if (parameter.ParameterType.IsArray == true)
            {
                return(this.GetPathQueryArray(pathQuery, parameter));
            }

            return(this.GetPathQueryComplex(pathQuery, parameter));
        }
Ejemplo n.º 9
0
        /// <summary>
        /// 获取新的Path与Query
        /// </summary>
        /// <param name="pathQuery">原始path与query</param>
        /// <param name="parameter">参数</param>
        /// <returns></returns>
        private string GetPathQueryComplex(string pathQuery, ApiParameterDescriptor parameter)
        {
            var instance     = parameter.Value;
            var instanceType = parameter.ParameterType;

            var properties = Property.GetProperties(instanceType);

            foreach (var p in properties)
            {
                var value = instance == null ? null : p.GetValue(instance);
                pathQuery = this.GetPathQuerySimple(pathQuery, p.Name, value);
            }
            return(pathQuery);
        }
Ejemplo n.º 10
0
        /// <summary>
        /// 获取新的Path与Query
        /// </summary>
        /// <param name="pathQuery">原始path与query</param>
        /// <param name="parameter">参数</param>
        /// <returns></returns>
        private string GetPathQueryArray(string pathQuery, ApiParameterDescriptor parameter)
        {
            var array = parameter.Value as Array;

            if (array == null)
            {
                return(pathQuery);
            }

            foreach (var item in array)
            {
                pathQuery = this.GetPathQuerySimple(pathQuery, parameter.Name, item);
            }
            return(pathQuery);
        }
Ejemplo n.º 11
0
        /// <summary>
        /// 生成ApiParameterDescriptor
        /// </summary>
        /// <param name="parameter">参数信息</param>
        /// <param name="index">参数索引</param>
        /// <returns></returns>
        private static ApiParameterDescriptor GetParameterDescriptor(ParameterInfo parameter, int index)
        {
            var parameterDescriptor = new ApiParameterDescriptor
            {
                Name          = parameter.Name,
                Index         = index,
                ParameterType = parameter.ParameterType,
                IsSimpleType  = CastleContext.IsSimple(parameter.ParameterType),
                Attributes    = parameter.GetCustomAttributes <ApiParameterAttribute>(true).ToArray()
            };

            if (typeof(HttpContent).IsAssignableFrom(parameter.ParameterType))
            {
                parameterDescriptor.Attributes = new[] { new HttpContentAttribute() };
            }
            else if (parameterDescriptor.Attributes.Length == 0)
            {
                parameterDescriptor.Attributes = new[] { new PathQueryAttribute() };
            }
            return(parameterDescriptor);
        }
Ejemplo n.º 12
0
 /// <summary>
 /// 获取http请求内容
 /// </summary>
 /// <param name="context">上下文</param>
 /// <param name="parameter">特性关联的属性</param>
 /// <returns></returns>
 protected virtual HttpContent GetHttpContent(ApiActionContext context, ApiParameterDescriptor parameter)
 {
     return(parameter.Value as HttpContent);
 }
Ejemplo n.º 13
0
        /// <summary>
        /// http请求之前
        /// </summary>
        /// <param name="context">上下文</param>
        /// <param name="parameter">特性关联的参数</param>
        /// <returns></returns>
        public sealed override async Task BeforeRequestAsync(ApiActionContext context, ApiParameterDescriptor parameter)
        {
            if (context.RequestMessage.Method == HttpMethod.Get)
            {
                return;
            }

            var httpContent = this.GetHttpContent(context, parameter);

            context.RequestMessage.Content = httpContent;
            await TaskExtensions.CompletedTask;
        }
Ejemplo n.º 14
0
 /// <summary>
 /// http请求之前
 /// </summary>
 /// <param name="context">上下文</param>
 /// <param name="parameter">特性关联的参数</param>
 /// <returns></returns>
 public abstract Task BeforeRequestAsync(ApiActionContext context, ApiParameterDescriptor parameter);
Ejemplo n.º 15
0
        /// <summary>
        /// 获取http请求内容
        /// </summary>
        /// <param name="context">上下文</param>
        /// <param name="parameter">特性关联的参数</param>
        /// <returns></returns>
        protected override HttpContent GetHttpContent(ApiActionContext context, ApiParameterDescriptor parameter)
        {
            var json = parameter.Value == null ? null : context.HttpApiClient.JsonFormatter.Serialize(parameter.Value);

            return(new StringContent(json, Encoding.UTF8, "application/json"));
        }
Ejemplo n.º 16
0
        /// <summary>
        /// 获取http请求内容
        /// </summary>
        /// <param name="context">上下文</param>
        /// <param name="parameter">特性关联的参数</param>
        /// <returns></returns>
        protected sealed override HttpContent GetHttpContent(ApiActionContext context, ApiParameterDescriptor parameter)
        {
            var encoding = Encoding.UTF8;
            var body     = this.GetFormContent(parameter, encoding);

            return(new StringContent(body, encoding, "application/x-www-form-urlencoded"));
        }