Exemplo n.º 1
0
 /// <summary>
 /// 发送代理请求
 /// </summary>
 /// <returns></returns>
 private bool SendProxyRequest(ReverseProxyContext context, out string response)
 {
     try
     {
         //remove content-length and host
         context.Headers.Remove(kv => kv.Key.Equals("Content-Length", StringComparison.OrdinalIgnoreCase) || kv.Key.Equals("host", StringComparison.OrdinalIgnoreCase));
         var http = new HttpHelper(context.TransferUrl);
         if (context.Headers != null && context.Headers.Count > 0)
         {
             context.Headers.Aggregate(http, (h, kv) => { Log.Info($"{kv.Key}={kv.Value}"); return(h.AddHeaderData(kv.Key, kv.Value)); });
         }
         if ("GET".Equals(context.HttpMethod, StringComparison.OrdinalIgnoreCase))
         {
             response = http.Get(context.ForwardValue.ToString());
         }
         else
         {
             //response = http.SendRequest(context.HttpMethod, context.ForwardValue.ToArray(), context.ReverseConfig.timeout, false,"application/json");
             response = http.Post(context.ForwardValue.ToString(), context.ReverseConfig.timeout, false, "application/json");
         }
         return(http.StatusCode == 200);
     }
     catch (Exception ex)
     {
         Log.Error("请求转发失败", ex);
         response = "请求转发失败";
         return(false);
     }
 }
Exemplo n.º 2
0
        private ReverseProxyContext GetProxyContext(HttpContext context, ReverseProxyConfigModel config)
        {
            var ctx = new ReverseProxyContext();

            ctx.Query              = context.Request.Query;
            ctx.RequestUrl         = string.Concat(context.Request.Scheme, "://", context.Request.Host, context.Request.Path, context.Request.QueryString.Value);
            ctx.Cookies            = context.Request.Cookies;
            ctx.HttpMethod         = context.Request.Method;
            ctx.InputStream        = context.Request.Body;
            ctx.RequestContentType = context.Request.ContentType;
            ctx.ReverseConfig      = config;
            foreach (string k in context.Request.Headers.Keys)
            {
                ctx.Headers.Add(k, context.Request.Headers[k]);
            }
            return(ctx);
        }
Exemplo n.º 3
0
        public FuncResult <IParameterModel> Resolve(ReverseProxyContext context)
        {
            var result = GetParameterModel(context.HttpMethod, context.InputStream, context.Query);

            if (!result.Success)
            {
                return(result);
            }
            var signV = result.Content.VerifySignature();

            if (!signV.Success)
            {
                return(FuncResult.FailResult <IParameterModel>(signV.Message, signV.StatusCode));
            }
            ContentType contentType = "GET".Equals(context.HttpMethod, StringComparison.OrdinalIgnoreCase) ? ContentType.form_urlencoded : ContentType.json;

            context.DataModel    = result.Content;
            context.ForwardValue = new ProxyForwardValue(context.DataModel.GetBizContent(), contentType);
            return(FuncResult.SuccessResult(context.DataModel));
        }
        public virtual bool Resolve(ReverseProxyContext context)
        {
            Log.Info($"service={context.DataModel?.GetServiceCode()}");
            Mapping hitmap = null;
            string  path   = null;

            if (!string.IsNullOrEmpty(context.DataModel?.GetServiceCode()))
            {
                hitmap = context.ReverseConfig.mapping.Find(m => context.DataModel.GetServiceCode().Equals(m.upstream, StringComparison.Ordinal));
            }
            else
            {
                Uri local = new Uri(context.RequestUrl);
                path = local.AbsolutePath;
                string host = string.Concat(local.Host, ":", local.Port);
                hitmap = context.ReverseConfig.mapping.Find(m =>
                {
                    string up = m.upstream;
                    if (!m.upstream.Contains(":"))
                    {
                        up += ":80";
                    }
                    return(up.Equals(host, StringComparison.OrdinalIgnoreCase));
                });
            }
            if (hitmap == null)
            {
                return(false);
            }
            var rdn  = new Random();
            var i    = rdn.Next(0, hitmap.downstream.Length - 1);
            var down = hitmap.downstream[i];

            context.TransferUrl = string.Concat(down.host, path);
            return(true);
        }