/// <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); }; }
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}" }; }