/// <summary> /// 异步监听回调 /// </summary> /// <param name="ar"></param> private void Result(IAsyncResult ar) { if (BaseListener == null || !BaseListener.IsListening) { return; } //当接收到请求后程序流会走到这里 //继续异步监听 BaseListener.BeginGetContext(Result, null); GUID = Guid.NewGuid().ToString(); //获得context对象 var context = BaseListener.EndGetContext(ar); var request = context.Request; var response = context.Response; ////如果是js的ajax请求,还可以设置跨域的ip地址与参数 //context.Response.AppendHeader("Access-Control-Allow-Origin", "*"); //后台跨域请求,通常设置为配置文件 //context.Response.AppendHeader("Access-Control-Allow-Headers", "ID,PW"); //后台跨域参数设置,通常设置为配置文件 //context.Response.AppendHeader("Access-Control-Allow-Method", "post"); //后台跨域请求设置,通常设置为配置文件 response.ContentType = "text/plain;charset=UTF-8"; //告诉客户端返回的ContentType类型为纯文本格式,编码为UTF-8 response.AddHeader("Content-type", "text/plain"); //添加响应头信息 response.ContentEncoding = Encoding.UTF8; //定义返回客户端的信息,当请求为POST方式时返回处理过的信息,否则判断可能为网页访问、返回指定消息 string returnObj = request.HttpMethod == "POST" && request.InputStream != null?HandleRequest(request, response) : WebExplorerMessage; var returnByteArr = Encoding.UTF8.GetBytes(returnObj); //设置客户端返回信息的编码 //把处理信息返回到客户端 try { using (var stream = response.OutputStream) { stream.Write(returnByteArr, 0, returnByteArr.Length); } } catch (Exception ex) { LastErrorMessage = $"网络蹦了:{ex.ToString()}"; } }
/// <summary> /// 启动监听器 /// </summary> public int Start() { int result = 1; try { if (BaseListener == null) { BaseListener = new HttpListener(); //提供一个简单的、可通过编程方式控制的 HTTP 协议侦听器。此类不能被继承。 //配置监听地址。+代表本机可能的IP,如localhost、127.0.0.1、192.168.199.X(本机IP)等,假如失败则以管理员方式启动 //string address = $"http://{IpAddress}:{Port}/web/"; string address = $"http://+:{Port}{Suffix}"; BaseListener.Prefixes.Clear(); BaseListener.Prefixes.Add(address); //定义url及端口号,通常设置为配置文件 BaseListener.Start(); Name = address; } //异步监听客户端请求,当客户端的网络请求到来时会自动执行Result委托 //该委托没有返回值,有一个IAsyncResult接口的参数,可通过该参数获取context对象 BaseListener.BeginGetContext(Result, null); _raiser.Run(); if (BaseListener.IsListening) { ServiceStateChanged?.BeginInvoke(this, new ServiceStateEventArgs($"HTTP监听服务{Name}已启动", ServiceState.Started), null, null); } } catch (Exception e) { LastErrorMessage = $"HTTP监听服务{Name}启动过程中出现错误:{e.Message}"; result = 0; Stop(); //throw; } return(result); }