C# 的winform程序竟然可以这样开启Http服务.

写C#少说也有10来年了. 竟然可以在winform中这样开启Http服务, 以后可以不要iis了.
代码摘抄自AIBOX的Demo

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace AiBox.Win.Server.Demo
{
    public class WebPostService
    {
        private static WebPostService _instance;
        public static WebPostService Instance
        {
            get
            {
                if (_instance == null)
                {
                    _instance = new WebPostService();
                }
                return _instance;
            }
        }

        private System.Net.HttpListener _listener = null;

        public bool startSta = false;

        /// <summary>
        /// 启动
        /// </summary>
        public void Start(string ip,int port)
        {
            Stop();


            List<string> httpPrefixes = new List<string>();
            httpPrefixes.Add("http://" + ip + ":" + port + "/" + "UpVmsRecord/"); 
            new Thread(new ThreadStart(delegate
             {
                 _listener = new HttpListener();
                 while (true)
                 {
                     try
                     {
                         _listener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
                        //_listener.Prefixes.Add(httpPrefixes0);
                        //_listener.Prefixes.Add(httpPrefixes1);
                        if (httpPrefixes != null)
                         {
                             foreach (string url in httpPrefixes)
                             {
                                 _listener.Prefixes.Add(url);
                             }
                         }
                         _listener.Start();

                     }
                     catch (Exception ex)
                     {
                         startSta = false;
                         break;
                     }

                    //线程池
                     int minThreadNum;
                     int portThreadNum;
                     int maxThreadNum;
                     ThreadPool.GetMaxThreads(out maxThreadNum, out portThreadNum);
                     ThreadPool.GetMinThreads(out minThreadNum, out portThreadNum);
                    //ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc1), x);
                     try
                     {
                         while (true)
                         {
                             startSta = true;
                            //等待请求连接
                            //没有请求则GetContext处于阻塞状态
                            HttpListenerContext ctx = _listener.GetContext();

                             ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc), ctx);
                         }
                     }
                     catch {
                         startSta = false;
                     }
                 }
             })).Start();
        }

        /// <summary>
        /// 停止
        /// </summary>
        public void Stop()
        {
            if (_listener != null)
            {
                _listener.Stop();
                _listener.Close();
                _listener = null;
            }
        }

        /// <summary>
        /// 任务进
        /// </summary>
        /// <param name="obj"></param>
        void TaskProc(object obj)
        {
            HttpListenerContext ctx = (HttpListenerContext)obj;
            try
            {
                var url = ctx.Request.Url.AbsoluteUri;
                Stream stream = ctx.Request.InputStream;
                System.IO.StreamReader reader = new System.IO.StreamReader(stream, Encoding.UTF8);
                if (url.Contains("UpVmsRecord"))
                {
                    #region 
                    string body = reader.ReadToEnd();
                    //这里的body就是客户端发过来的数据
                    var upRecord = Newtonsoft.Json.JsonConvert.DeserializeObject<UpEventRecord>(body);
                    if(upRecord!=null)
                    {
                        Form1._Instance.InsertRecord(upRecord);
                    }
                    #endregion 
                }
                stream.Close();
                ctx.Response.Close();
                ctx = null;
            }
            catch (Exception ex)
            {
                System.Console.WriteLine(ex.ToString());
            }
        }
    }
}

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
完整的服务端及客户端调用程序,在win7+ vs2015环境运行通过. 一、说明 1、创建winfrom应用程序;(或者是控制台项目) 2、在项目中添加一个WCF服务,并实现服务; 3、在需要启动WebService服务的地方启动该服务即可; 二、代码如下: 1、新建一个WCF服务——定义服务接口    [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]     public interface ICalculator     {         [OperationContract]         double Add(double n1, double n2);     } 2、新建一个WCF服务——实现服务 public class CalculatorService : ICalculator     {         public double Add(double n1, double n2)         {             return n1 + n2;         }     } 3、添加完WcF服务后会在应用程序配置文件中有入下节点                             <!--TestServer.ICalculator服务定义的接口,根据自己定义进行修改-->                                                                   <baseAddresses> <!--这个是要发布的服务地址,可以进行修改-->                                   </baseAddresses>                   4、在要启动服务的地方启动服务监听   public frmMain() { InitializeComponent(); } private void frmMain_Load(object sender, EventArgs e) { try { //打开服务创建监听,并开始监听消息 ServiceHost serviceHost = new ServiceHost(typeof(Service1));//需要using System.ServiceModel; serviceHost.Open(); label1.Text = "服务启动正常"; } catch (Exception ex) { label1.Text = ex.Message; } } 5、下面可以在客户端通过上面的服务地址”http://xxx.xxx.xxx.xx:8733/test/Service1/“对服务进行调用 到这步就实现在控制台中实现webService的发布。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值