/// <summary>
        /// 构造httpcontext
        /// </summary>
        /// <param name="entryContext"></param>
        /// <returns></returns>
        internal static HttpContext CreateHttpContext(HttpContext entryContext, JsonRpcRequest request)
        {
            var context = new InMemoryHttpContext(entryContext.Features)
            {
                RequestServices = entryContext.RequestServices
            };
            var uri = new Uri(request.Method, UriKind.RelativeOrAbsolute);

            if (!uri.IsAbsoluteUri)
            {
                uri = new Uri($"http://localhost/{request.Method.TrimStart('/')}");
            }

            context.Request.Path        = uri.AbsolutePath;
            context.Request.QueryString = new QueryString(uri.Query);

            PropertyDescriptorCollection properties = null;
            var isPost = request.Params != null && (properties = TypeDescriptor.GetProperties(request.Params)).Count > 0;

            context.Request.Method = isPost ? "Post" : "Get";
            if (isPost)
            {
                context.Request.Headers.Remove("Content-Type");
                context.Request.Headers.Add("Content-Type", "application/json");

                foreach (var prop in request.Properties)
                {
                    if (prop.Key == CobMvcDefaults.UserAgentValue)
                    {
                        context.Request.Headers["User-Agent"] = prop.Value;

                        continue;
                    }

                    context.Request.Headers[prop.Key] = prop.Value;
                }

                var ms = context.Request.Body = new MemoryStream();
                using (var sw = new StreamWriter(ms, new UTF8Encoding(false), 512, true))
                {
                    if (properties.Count == 1)
                    {
                        sw.Write(JsonConvert.SerializeObject(properties[0].GetValue(request.Params)));//
                    }
                    else
                    {
                        if (properties.Count > 1 && !entryContext.RequestServices.GetRequiredService <IOptions <CobMvcOptions> >().Value.EnableCobMvcParametersBinder)
                        {
                            throw new Exception("find many parameters from body, please set CobMvcOptions.EnableCobMvcParametersBinder");
                        }

                        sw.Write(JsonConvert.SerializeObject(request.Params));//todo:直接Pramas将放入Items,后面由自定义参数绑定赋值参数
                    }
                }

                ms.Position = 0;
            }

            return(context);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 构造httpcontext
        /// </summary>
        /// <param name="entryContext"></param>
        /// <returns></returns>
        internal static HttpContext CreateHttpContext(HttpContext entryContext, JsonRpcRequest request)
        {
            var context = new InMemoryHttpContext(entryContext.Features)
            {
                RequestServices = entryContext.RequestServices
            };
            var uri = new Uri(request.Method, UriKind.RelativeOrAbsolute);

            if (!uri.IsAbsoluteUri)
            {
                uri = new Uri($"http://localhost/{request.Method.TrimStart('/')}");
            }

            context.Request.Path        = uri.AbsolutePath;
            context.Request.QueryString = new QueryString(uri.Query);

            PropertyDescriptorCollection properties = null;
            var isPost = request.Params != null && (properties = TypeDescriptor.GetProperties(request.Params)).Count > 0;

            context.Request.Method = isPost ? "Post" : "Get";
            if (isPost)
            {
                context.Request.Headers.Remove("Content-Type");
                context.Request.Headers.Add("Content-Type", "application/json");

                var ms = context.Request.Body = new MemoryStream();
                using (var sw = new StreamWriter(ms, new UTF8Encoding(false), 512, true))
                {
                    if (properties.Count == 1)
                    {
                        sw.Write(JsonConvert.SerializeObject(properties[0].GetValue(request.Params)));
                    }
                    else
                    {
                        sw.Write(JsonConvert.SerializeObject(request.Params));
                    }
                }
                ms.Position = 0;
            }

            return(context);
        }