Ejemplo n.º 1
0
        /// <summary>
        /// 指南针自定义网络服务
        /// </summary>
        /// <param name="sn">服务名</param>
        /// <param name="port">端口号</param>
        /// <param name="asm"></param>
        protected HttpServer(string sn, short port = 80)
        {
            Port       = port;
            ServerName = sn;
            Init();
            DoGetMethod = content =>
            {
                var fileName = content.Request.Url.AbsolutePath.Remove(0, 1);
#if DEBUG
                Console.WriteLine(fileName);
#endif
                fileName = !File.Exists(fileName)?AnalysisFile(fileName): fileName;
                if (File.Exists(fileName))
                {
                    var reader = new FileStream(fileName, FileMode.Open);
                    var bytes  = new byte[reader.Length];

                    reader.Read(bytes, 0, bytes.Length);
                    reader.Close();
                    return(bytes);
                }

                var postResult = DoPostMethod.Invoke(content);
                return(Encoding.UTF8.GetBytes(string.IsNullOrEmpty(postResult) ? Nullstring : postResult));
            };

            DoPostMethod = content =>
            {
                string result;
                //获取访问路径
                var path = content.Request.Url.AbsolutePath.Remove(0, 1);

                string[] strs = path.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);

                if (strs.Length <= 2 || !sn.Equals(strs[0]))
                {
                    return(Nullstring);
                }
                //if (!sn.Equals(strs[0])) return Nullstring;
                var service = strs[1];
                var action  = strs[2];
                //判断是否调用的是本模块
                if (Api != null)
                {
                    var attrs = Api.GetType().GetCustomAttributes(typeof(ApiPath), true) as ApiPath[];
                    if (attrs == null || !attrs.Any(o => o.Name.Equals(service, StringComparison.CurrentCultureIgnoreCase)))
                    {
                        result = WorkWithConstomApi(service, action, content);
                    }
                    else
                    {
                        result = Api.Action(content, action);
                    }
                }
                else if (Apis != null)
                {
                    result = WorkWithConstomApi(service, action, content);
                }
                else
                {
                    result = Ots;
                }
                return(result);
            };
        }
Ejemplo n.º 2
0
        private void Init()
        {
            ConfigurationInfo();
            var prefix = string.Format(UriFormat, Port);//string.IsNullOrEmpty(ServerName) ? $"http://*:{Port}/{ServerName}/" : $"http://*:{Port}/";

            if (!string.IsNullOrEmpty(ServerName))
            {
                prefix += ServerName + "/";
            }
            //初始化Linstener
            Listener = new HttpListener()
            {
                AuthenticationSchemes = AuthenticationSchemes.Anonymous,
                Prefixes = { prefix, },
                UnsafeConnectionNtlmAuthentication = true,
                //Realm
            };

            MainThread = new Thread(() =>
            {
                while (_isRunning)
                {
                    if (!Listener.IsListening)
                    {
                        continue;
                    }
                    //获取请求上下文
                    HttpListenerContext context = null;
                    try
                    {
                        context = Listener.GetContext();
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }

                    if (context == null)
                    {
                        continue;
                    }
                    var method = context.Request.HttpMethod;
#if DEBUG
                    foreach (var key in context.Request.Headers.AllKeys)
                    {
                        Console.WriteLine($"{key}:{context.Request.Headers[key]}");
                    }
#endif

                    //根据请求方式,处理请求并返回响应信息
                    if ("GET".Equals(method))
                    {
                        if (DoGetMethod == null)
                        {
                            return;
                        }
                        ThreadPool.QueueUserWorkItem((state =>
                        {
                            var con = state as HttpListenerContext;
                            if (con == null)
                            {
                                return;
                            }
                            var res = DoGetMethod.Invoke(con);
                            PutGetResponse(res, con);
                        }), context);
                    }
                    else if ("POST".Equals(method))
                    {
                        if (DoPostMethod == null)
                        {
                            return;
                        }
                        ThreadPool.QueueUserWorkItem(state =>
                        {
                            var con = state as HttpListenerContext;
                            if (con == null)
                            {
                                return;
                            }
                            var res = DoPostMethod.Invoke(con);
                            PutPostResponse(res, con);
                        }, context);
                    }
                    else
                    {
                        var res = context.Response;
                        res.AppendHeader("Access-Control-Allow-Origin", "*");
                        res.AppendHeader("Access-Control-Allow-Methods", "POST");
                        res.AppendHeader("Access-Control-Allow-Header", "Cookie");
                        res.StatusCode = 200;
                        res.Close();
                    }
                }
            })
            {
                IsBackground = true, Name = $"Http服务主线程-port:{Port}"
            };
        }