/// <summary>
        /// 创建ApiTaskOf(T)的实例
        /// </summary>
        /// <param name="httpApiConfig">http接口配置</param>
        /// <param name="apiActionDescriptor">api描述</param>
        /// <returns></returns>
        public static ApiTask CreateInstance(HttpApiConfig httpApiConfig, ApiActionDescriptor apiActionDescriptor)
        {
            // var instance = new ApiTask<TResult>(httpApiConfig, apiActionDescriptor);
            var ctor = apiActionDescriptor.Return.ITaskCtor;

            return(ctor.Invoke(new object[] { httpApiConfig, apiActionDescriptor }) as ApiTask);
        }
        public async Task BeforeRequestAsyncTest()
        {
            var apiAction = new ApiActionDescriptor(typeof(IMyApi).GetMethod("PostAsync"));
            var context   = new TestRequestContext(apiAction, new
            {
                name     = "laojiu",
                birthDay = DateTime.Parse("2010-10-10")
            });

            context.HttpContext.RequestMessage.RequestUri = new Uri("http://www.webapi.com/");
            context.HttpContext.RequestMessage.Method     = HttpMethod.Post;

            var attr = new JsonContentAttribute();
            await attr.OnRequestAsync(new ApiParameterContext(context, 0));

            var body = await context.HttpContext.RequestMessage.Content.ReadAsByteArrayAsync();

            var options = context.HttpContext.HttpApiOptions.JsonSerializeOptions;

            using var buffer = new BufferWriter <byte>();
            context.HttpContext.ServiceProvider.GetService <IJsonSerializer>().Serialize(buffer, context.Arguments[0], options);
            var target = buffer.GetWrittenSpan().ToArray();

            Assert.True(body.SequenceEqual(target));
        }
Example #3
0
        public async Task OnRequestAsync_Parameter_Timespan_Test()
        {
            var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync"));
            var context   = new TestRequestContext(apiAction, 5);

            var attr = new TimeoutAttribute();

            var parameterContext = new ApiParameterContext(context, 0);
            await attr.OnRequestAsync(parameterContext, () => Task.CompletedTask);

            await Task.Delay(20);

            var canceled = context.CancellationTokens[0].IsCancellationRequested;

            Assert.True(canceled);

            context.Arguments[0] = Guid.NewGuid();

            await Assert.ThrowsAsync <HttpApiInvalidOperationException>(()
                                                                        => attr.OnRequestAsync(parameterContext, () => Task.CompletedTask));

            context.Arguments[0] = null;

            await attr.OnRequestAsync(parameterContext, () => Task.CompletedTask);

            Assert.True(context.CancellationTokens.Count == 1);
        }
        /// <summary>
        /// 创建DefaultApiActionInvoker类型或其子类型的实例
        /// </summary>
        /// <param name="actionDescriptor">Action描述</param>
        /// <returns></returns>
        protected virtual ApiActionInvoker CreateDefaultActionInvoker(ApiActionDescriptor actionDescriptor)
        {
            var resultType  = actionDescriptor.Return.DataType.Type;
            var invokerType = typeof(DefaultApiActionInvoker <>).MakeGenericType(resultType);

            return(invokerType.CreateInstance <ApiActionInvoker>(actionDescriptor));
        }
Example #5
0
        public async Task OnRequestAsyncRelativeTest()
        {
            var apiAction = new ApiActionDescriptor(typeof(IMyApi).GetMethod("PostAsync"));
            var context   = new TestRequestContext(apiAction, "http://www.baidu.com");

            var attr = new UriAttribute();
            await attr.OnRequestAsync(new ApiParameterContext(context, 0));

            Assert.True(context.HttpContext.RequestMessage.RequestUri == new Uri("http://www.baidu.com"));

            context.Arguments[0] = "/login";
            await attr.OnRequestAsync(new ApiParameterContext(context, 0));

            Assert.True(context.HttpContext.RequestMessage.RequestUri == new Uri("http://www.baidu.com/login"));

            context.Arguments[0] = "/login/login2";
            await attr.OnRequestAsync(new ApiParameterContext(context, 0));

            Assert.True(context.HttpContext.RequestMessage.RequestUri == new Uri("http://www.baidu.com/login/login2"));

            context.Arguments[0] = "login3";
            await attr.OnRequestAsync(new ApiParameterContext(context, 0));

            Assert.True(context.HttpContext.RequestMessage.RequestUri == new Uri("http://www.baidu.com/login/login3"));
        }
Example #6
0
        /// <summary>
        /// 生成ApiActionDescriptor
        /// </summary>
        /// <param name="method">拦截方法</param>
        /// <returns></returns>
        private static ApiActionDescriptor GetActionDescriptor(MethodInfo method)
        {
            var descriptor = new ApiActionDescriptor
            {
                Name           = method.Name,
                ReturnTaskType = method.ReturnType,
                ReturnDataType = method.ReturnType.IsGenericType && method.ReturnType.GetGenericTypeDefinition().IsAssignableFrom(typeof(Task <>)) ? method.ReturnType.GetGenericArguments().FirstOrDefault() : method.ReturnType,
                Attributes     = method.GetCustomAttributes <ApiActionAttribute>(true).ToArray(),
                Parameters     = method.GetParameters().Select((param, index) => GetParameterDescriptor(param, index, method)).ToArray()
            };

            if (!descriptor.Attributes.Any(x => x is HttpMethodAttribute))
            {
                descriptor.Attributes = descriptor.Attributes.Concat(new[] {
                    new HttpPostAttribute(Regex.Replace($"method/{method.DeclaringType.FullName}/{method.Name}/{string.Join("-", method.GetParameters().Select(x => x.ParameterType.FullName))}".ToLower(), "[^a-z|0-9]", "-"))
                }).ToArray();
            }

            if (descriptor.Parameters.Count(x => x.Attributes.Any(o => o.GetType() != typeof(PathQueryAttribute))) > 1)
            {
                throw new NotSupportedException("不支持多个非值类型作为参数,请使用实体封装。");
            }

            return(descriptor);
        }
Example #7
0
        public async Task OnRequestAsyncTest()
        {
            var apiAction = new ApiActionDescriptor(typeof(IMyApi).GetMethod("PostAsync"));
            var context   = new TestRequestContext(apiAction, new
            {
                @class = 123,
                xx_yy  = "xxyy"
            });

            var attr = new HeadersAttribute();

            context.HttpContext.RequestMessage.Headers.Clear();
            await attr.OnRequestAsync(new ApiParameterContext(context, 0));

            context.HttpContext.RequestMessage.Headers.TryGetValues("xx-yy", out IEnumerable <string> values);
            Assert.Equal("xxyy", values.FirstOrDefault());

            context.HttpContext.RequestMessage.Headers.TryGetValues("class", out IEnumerable <string> cValues);
            Assert.Equal("123", cValues.FirstOrDefault());



            attr.UnderlineToMinus = false;
            context.HttpContext.RequestMessage.Headers.Clear();
            await attr.OnRequestAsync(new ApiParameterContext(context, 0));

            context.HttpContext.RequestMessage.Headers.TryGetValues("xx_yy", out IEnumerable <string> values2);
            Assert.Equal("xxyy", values2.FirstOrDefault());
        }
Example #8
0
 /// <summary>
 /// 请求Api的上下文
 /// </summary>
 /// <param name="httpContext"></param>
 /// <param name="apiAction"></param>
 /// <param name="arguments"></param>
 /// <param name="properties"></param>
 protected ApiRequestContext(HttpContext httpContext, ApiActionDescriptor apiAction, object?[] arguments, DataCollection properties)
 {
     this.HttpContext = httpContext;
     this.ApiAction   = apiAction;
     this.Arguments   = arguments;
     this.Properties  = properties;
 }
Example #9
0
        public async Task OnRequestAsyncTest()
        {
            var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync"));
            var context   = new TestRequestContext(apiAction, string.Empty);

            context.HttpContext.RequestMessage.RequestUri = new Uri("http://www.webapi.com/");
            context.HttpContext.RequestMessage.Method     = HttpMethod.Post;

            var attr = new HttpPutAttribute();
            await attr.OnRequestAsync(context);

            Assert.True(context.HttpContext.RequestMessage.Method == HttpMethod.Put);

            var attr2 = new HttpPutAttribute("/login");
            await attr2.OnRequestAsync(context);

            Assert.True(context.HttpContext.RequestMessage.Method == HttpMethod.Put);
            Assert.True(context.HttpContext.RequestMessage.RequestUri == new Uri("http://www.webapi.com/login"));

            var attr3 = new HttpPutAttribute("http://www.baidu.com");
            await attr3.OnRequestAsync(context);

            Assert.True(context.HttpContext.RequestMessage.Method == HttpMethod.Put);
            Assert.True(context.HttpContext.RequestMessage.RequestUri == new Uri("http://www.baidu.com"));
        }
        public void InitTest()
        {
            var descriptor = new ApiActionDescriptor("http://api.dev/", typeof(IAubTestApi).GetMethod("PostAsync"));

            var attr1 = new HttpRoutePrefixAttribute("order-history");

            attr1.Init(descriptor);
            Assert.True(descriptor.RoutePrefix == "order-history");
        }
        public void InitTest()
        {
            Assert.Throws <ArgumentNullException>(() => new ApiActionDescriptor(null, null));

            var method     = typeof(IAubTestApi).GetMethod("PostAsync");
            var descriptor = new ApiActionDescriptor("http://api.dev/", method);

            Assert.NotNull(descriptor.Uri);
        }
        public void NewTest()
        {
            var method     = typeof(IAubTestApi).GetMethod("PostAsync");
            var descriptor = new ApiActionDescriptor("http://api.dev/", method);

            Assert.True(descriptor.Attributes.Count == 3);
            Assert.True(descriptor.Name == method.Name);
            Assert.True(descriptor.Host == "http://api.dev/");
            Assert.True(descriptor.Member == method);
            Assert.True(descriptor.Parameters.Count == 2);
        }
Example #13
0
        public async Task OnRequestAsync()
        {
            var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync"));
            var context   = new TestRequestContext(apiAction, string.Empty);

            var attr = new HeaderAttribute("MyHeader", "laojiu");
            await attr.OnRequestAsync(context);

            context.HttpContext.RequestMessage.Headers.TryGetValues("MyHeader", out IEnumerable <string> values);
            Assert.Equal("laojiu", values.First());
        }
        public void NewTest()
        {
            var m = typeof(IUserApi).GetMethod("Get1");
            var d = new ApiActionDescriptor(m);

            Assert.True(d.Attributes.Count == 3);
            Assert.True(d.Filters.Count == 1);
            Assert.True(d.Parameters.Count == 2);
            Assert.True(d.Name == m.Name);
            Assert.True(d.Member == m);
            Assert.True(d.Return.ReturnType == m.ReturnType);
        }
Example #15
0
        public async Task OnRequestAsync()
        {
            var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync"));
            var context   = new TestRequestContext(apiAction, "value");

            var basicAuth = new BasicAuth("laojiu", "123456");
            await basicAuth.OnRequestAsync(new ApiParameterContext(context, 0));

            var auth = Convert.ToBase64String(Encoding.ASCII.GetBytes("laojiu:123456"));

            Assert.True(context.HttpContext.RequestMessage.Headers.Authorization.Parameter == auth);
        }
        /// <summary>
        /// 创建Action执行器
        /// </summary>
        /// <param name="actionDescriptor">Action描述</param>
        /// <returns></returns>
        public ApiActionInvoker CreateActionInvoker(ApiActionDescriptor actionDescriptor)
        {
            var actionInvoker = this.CreateDefaultActionInvoker(actionDescriptor);

            if (actionDescriptor.Return.ReturnType.IsInheritFrom <Task>() == false)
            {
                if (actionInvoker is IITaskReturnConvertable convertable)
                {
                    actionInvoker = convertable.ToITaskReturnActionInvoker();
                }
            }
            return(actionInvoker);
        }
Example #17
0
        public async Task OnRequestAsyncTest()
        {
            var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync"));
            var context   = new TestRequestContext(apiAction, string.Empty);

            var attr = new BasicAuthAttribute("laojiu", "123456");
            await attr.OnRequestAsync(context);

            var auth = Convert.ToBase64String(Encoding.ASCII.GetBytes("laojiu:123456"));

            Assert.True(context.HttpContext.RequestMessage.Headers.Authorization.Scheme == "Basic");
            Assert.True(context.HttpContext.RequestMessage.Headers.Authorization.Parameter == auth);
        }
Example #18
0
        public void GetApiActionDescriptorTest()
        {
            var method      = typeof(IMyApi).GetMethod("Login");
            var descriptor1 = new ApiActionDescriptor(method);
            var descriptor2 = new ApiActionDescriptor(method);

            Assert.False(object.ReferenceEquals(descriptor1, descriptor2));

            Assert.True(descriptor1.Name == "Login");
            Assert.True(descriptor1.Parameters.Count == 1);
            Assert.True(descriptor1.Filters.Count == 0);
            Assert.True(descriptor1.Attributes.Count == 0);
        }
Example #19
0
        /// <summary>
        /// 生成ApiActionDescriptor
        /// </summary>
        /// <param name="invocation">拦截内容</param>
        /// <returns></returns>
        private static ApiActionDescriptor GetActionDescriptor(MethodInfo method)
        {
            var descriptor = new ApiActionDescriptor
            {
                Name           = $"{method.DeclaringType.Name}.{method.Name}",
                ReturnTaskType = method.ReturnType,
                ReturnDataType = method.ReturnType.IsGenericType ? method.ReturnType.GetGenericArguments().FirstOrDefault() : method.ReturnType,
                Attributes     = method.GetCustomAttributes <ApiActionAttribute>(true).ToArray(),
                Parameters     = method.GetParameters().Select(GetParameterDescriptor).ToArray()
            };

            return(descriptor);
        }
Example #20
0
        public async Task StringResultTest()
        {
            var apiAction       = new ApiActionDescriptor(typeof(ITestApi).GetMethod("StringAsync"));
            var context         = new TestRequestContext(apiAction, "laojiu");
            var responseContext = new ApiResponseContext(context);

            context.HttpContext.RequestMessage.Method   = HttpMethod.Post;
            context.HttpContext.ResponseMessage.Content = new StringContent("laojiu", Encoding.UTF8);

            var attr = new RawReturnAttribute();
            await attr.OnResponseAsync(responseContext);

            Assert.True(responseContext.Result?.ToString() == "laojiu");
        }
Example #21
0
        public async Task OnRequestAsync()
        {
            var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync"));
            var context   = new TestRequestContext(apiAction, string.Empty);

            context.HttpContext.RequestMessage.Method = HttpMethod.Post;

            var attr = new FormDataTextAttribute("value", "laojiu");
            await attr.OnRequestAsync(context);

            var body = await context.HttpContext.RequestMessage.Content.ReadAsStringAsync();

            Assert.Contains(get("value", "laojiu"), body);
        }
Example #22
0
        public async Task OnRequestAsyncTest()
        {
            var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync"));
            var context   = new TestRequestContext(apiAction, string.Empty);

            Assert.Throws <ArgumentNullException>(() => new HttpHostAttribute(null));
            Assert.Throws <UriFormatException>(() => new HttpHostAttribute("/"));

            context.HttpContext.RequestMessage.RequestUri = null;
            var attr = new HttpHostAttribute("http://www.webapiclient.com");
            await attr.OnRequestAsync(context);

            Assert.True(context.HttpContext.RequestMessage.RequestUri == new Uri("http://www.webapiclient.com"));
        }
Example #23
0
        public async Task OnRequestAsync()
        {
            var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync"));
            var context   = new TestRequestContext(apiAction, 10);

            var attr = new TimeoutAttribute(50);
            await attr.OnRequestAsync(context);

            await Task.Delay(100);

            var canceled = context.CancellationTokens[0].IsCancellationRequested;

            Assert.True(canceled);
        }
        public void CloneTest()
        {
            var m  = typeof(IUserApi).GetMethod("Get1");
            var d  = new ApiActionDescriptor(m);
            var d2 = d.Clone(new object[] { null, null });

            Assert.True(d.Attributes == d2.Attributes);
            Assert.True(d.Name == d2.Name);
            Assert.True(d.Filters == d2.Filters);
            Assert.True(d.Member == d2.Member);
            Assert.True(d.Parameters != d2.Parameters);
            Assert.True(d.Parameters.Count == d2.Parameters.Count);
            Assert.True(d.Return == d2.Return);
        }
Example #25
0
        /// <summary>
        /// 生成ApiActionDescriptor
        /// </summary>
        /// <param name="invocation">拦截内容</param>
        /// <returns></returns>
        private static ApiActionDescriptor GetActionDescriptor(AspectContext invocation)
        {
            var method = invocation.ServiceMethod;

            var descriptor = new ApiActionDescriptor
            {
                Name           = method.Name,
                ReturnTaskType = method.ReturnType,
                ReturnDataType = method.ReturnType.IsGenericType ? method.ReturnType.GetGenericArguments().FirstOrDefault() : method.ReturnType,
                Attributes     = method.GetCustomAttributes <ApiActionAttribute>(true).ToArray(),
                Parameters     = method.GetParameters().Select(GetParameterDescriptor).ToArray()
            };

            return(descriptor);
        }
        public async Task OnRequestAsyncTest()
        {
            var apiAction = new ApiActionDescriptor(typeof(IMyApi).GetMethod("PostAsync"));
            var context   = new TestRequestContext(apiAction, new StringContent("laojiu"));

            context.HttpContext.RequestMessage.RequestUri = new Uri("http://www.mywebapi.com");
            context.HttpContext.RequestMessage.Method     = HttpMethod.Post;

            var attr = new HttpContentTypeAttribute();
            await attr.OnRequestAsync(new ApiParameterContext(context, 0));

            var body = await context.HttpContext.RequestMessage.Content.ReadAsStringAsync();

            Assert.True(body == "laojiu");
        }
Example #27
0
        public async Task OnRequestAsync()
        {
            var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync"));
            var context   = new TestRequestContext(apiAction, "value");

            context.HttpContext.RequestMessage.RequestUri = new Uri("http://www.webapi.com/");
            context.HttpContext.RequestMessage.Method     = HttpMethod.Post;

            IApiParameter formField = new FormField("laojiu");
            await formField.OnRequestAsync(new ApiParameterContext(context, 0));

            var body = await context.HttpContext.RequestMessage.Content.ReadAsStringAsync();

            Assert.Equal("value=laojiu", body);
        }
        public void InitTest()
        {
            var descriptor = new ApiActionDescriptor("http://api.dev/", typeof(IAubTestApi).GetMethod("PostAsync"));

            var attr1 = new HttpHostAttribute("http://api.test.cc/");

            attr1.Init(descriptor);
            Assert.True(descriptor.Host == "http://api.dev/");

            descriptor.Host = null;
            var attr2 = new HttpHostAttribute("http://api.test.cc/");

            attr2.Init(descriptor);
            Assert.True(descriptor.Host == "http://api.test.cc/");
        }
Example #29
0
        public async Task OnRequestAsync_Parameter()
        {
            var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync"));
            var context   = new TestRequestContext(apiAction, "laojiu");

            context.HttpContext.RequestMessage.Method = HttpMethod.Post;
            var parameterContext = new ApiParameterContext(context, 0);

            var attr = new FormFieldAttribute();
            await attr.OnRequestAsync(parameterContext);

            var body = await context.HttpContext.RequestMessage.Content.ReadAsStringAsync();

            Assert.Equal("value=laojiu", body);
        }
Example #30
0
        public async Task OnRequestAsync_Parameter_Double_Test()
        {
            var apiAction = new ApiActionDescriptor(typeof(ITestApi).GetMethod("PostAsync"));
            var context   = new TestRequestContext(apiAction, 1);

            var attr             = new TimeoutAttribute();
            var parameterContext = new ApiParameterContext(context, 0);
            await attr.OnRequestAsync(parameterContext, () => Task.CompletedTask);

            await Task.Delay(20);

            var canceled = context.CancellationTokens[0].IsCancellationRequested;

            Assert.True(canceled);
        }
Example #31
0
        public SchemaCollection Get()
        {
            //var collection = Configuration.Properties.GetOrAdd("postmanCollection", k =>
            //    {
            var requestUri = Request.Url;
            string baseUri = requestUri.Scheme + "://" + requestUri.Host + ":" + requestUri.Port + HttpContext.Request.ApplicationPath;
            var postManCollection = new SchemaCollection();

            postManCollection.id = Guid.NewGuid();

            postManCollection.name = "Exposed Endpoints"; // TODO: Make configurable.

            postManCollection.timestamp = DateTime.Now.Ticks;

            postManCollection.requests = new Collection<SchemaRequest>();

            var actionDescriptors = new ApiActionDescriptor[0]; //Configuration.Services.GetApiExplorer().ApiDescriptions;
            foreach (var apiDescription in actionDescriptors)
            {
                var request = new SchemaRequest
                {
                    collectionId = postManCollection.id,
                    id = Guid.NewGuid(),
                    method = Request.RequestContext.GetHttpMethod(),
                    //url = baseUri.TrimEnd('/') + "/" + apiDescription.RelativePath,
                    //description = apiDescription.Documentation,
                    //name = apiDescription.RelativePath,
                    data = "",
                    headers = "",
                    dataMode = "params",
                    timestamp = 0
                };

                postManCollection.requests.Add(request);
            }

            //}) as SchemaCollection;

            Response.StatusCode = 200; //HtttpStatusCode.Ok
            Response.ContentType = "application/json";
            return postManCollection;
        }
Example #32
0
        /// <summary>
        /// Gets the EDM model for the given type and request.
        /// </summary>
        /// <param name="elementClrType">The CLR type to retrieve a model for.</param>
        /// <param name="request">The request message to retrieve a model for.</param>
        /// <param name="actionDescriptor">The action descriptor for the action being queried on.</param>
        /// <returns>The EDM model for the given type and request.</returns>
        /// <remarks>
        /// Override this method to customize the EDM model used for querying.
        /// </remarks>
        public virtual IEdmModel GetModel(Type elementClrType, HttpRequestMessage request, ApiActionDescriptor actionDescriptor)
        {
            // Get model for the request
            IEdmModel model = request.GetEdmModel();

            if (model == null || model.GetEdmType(elementClrType) == null)
            {
                // user has not configured anything or has registered a model without the element type
                // let's create one just for this type and cache it in the action descriptor
                model = actionDescriptor.GetEdmModel(elementClrType);
            }

            Contract.Assert(model != null);
            return model;
        }
Example #33
0
 protected virtual IEnumerable<Filter> GetQueryableFilters(ControllerContext controllerContext, ApiActionDescriptor actionDescriptor)
 {
     yield return new Filter(new QueryFilterAttribute(this.Validator) { ResultLimit = 10, InlineCount = true }, FilterScope.Last, null);
     yield return new Filter(new QueryOfTypeFilterAttribute(), FilterScope.Last, null);
 }