• Web Service


    摘自百度:  Web服务器可以解析(handles)HTTP协议。当Web服务器接收到一个HTTP请求(request),会返回一个HTTP响应(response),例如送回一个HTML页面。为了处理一个请求(request),Web服务器可以响应(response)一个静态页面或图片,进行页面跳转(redirect),或者把动态响应(dynamic response)的产生委托(delegate)给一些其它的程序例如CGI脚本,JSP(JavaServer Pages)脚本,servlets,ASP(Active Server Pages)脚本,服务器端(server-side)JavaScript,或者一些其它的服务器端(server-side)技术。无论它们(译者注:脚本)的目的如何,这些服务器端(server-side)的程序通常产生一个HTML的响应(response)来让浏览器可以浏览。

      Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。

    由终端程序调用web服务

    调用web服务,首先需要一个请求的地址

    string serviceUrl = ConfigurationManager.AppSettings["insertTrainMeasure"].ToString().Replace('$', '&');

    ConfigurationManager.AppSettings[]是读取程序中app.config文件的方法,括号中填入Key,获取相应的value;

    如:<add key="TaskStateUrl" value="http://10.2.101.50:7080/PRODUCT-LES/measure/measure/gettaskstate?taskid={0}"/>

    有了请求路径,就可以使用system.Net中的帮助类调用web服务了。

           /// <summary>
           /// get请求服务
           /// </summary>
           /// <param name="requestUrl">地址(地址?+参数)</param>
           /// <param name="timeout">超时设置</param>
            /// <returns>HttpWebRequest</returns>
            public static HttpWebRequest GetHttpGetWebRequest(string requestUrl, int timeout)
            {
                try
                {
                   
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUrl);  //根据指定的url创建新的WebRequest实例
                    request.Method = "GET";  //请求模式是GET,也可以是POET
                    request.Timeout = timeout * 1000;   设置HttpWebRequest.GetGetResponseStream()方法超时时间
                    request.ReadWriteTimeout = timeout * 1000;  //设置写入或读取流的超时时间
                    request.ContentType = "application/x-www-form-urlencoded";  //设置ContentType HTTP标头的值
                    //request.Referer = requestUrl;
                    request.Referer = System.Web.HttpUtility.UrlEncode(requestUrl);   //设置Referer标头的值
                    request.KeepAlive = false;  //获取或设置一个值,指示是否与internet资源建立持续性连接
                   
                    return request;
                }             
                catch (Exception ex)
                {
                    throw ex;
                }
            }

    这个方法最后返回一个HttpWebRequsst类型的对象。

    这个对象可以调用GetResponse();方法获取一个WebReponse类型的响应对象。

    然后既可以通过GetResponseStream()获取用于读取数据的流对象,通过流读取服务返回的内容

    
    
    public static string ResponseSynStr(HttpWebRequest req)
            {
                string result = string.Empty;
                WebResponse response = req.GetResponse();
                try
                {
                    Encoding encoding = Encoding.GetEncoding("UTF-8");
                    using (StreamReader streamReader = new StreamReader(response.GetResponseStream(), encoding))
                    {
                        result = streamReader.ReadToEnd();
                        streamReader.Dispose();
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    response.Close();
                }
                return result;
            }

    最后返回的string类型对象,就是服务返回的内容。

    -----------------------------------------------------------------------------------

    Post方式与Get方式相差不多

    /// <summary>
            /// post请求服务
            /// </summary>
            /// <param name="requestUrl">地址</param>
            /// <param name="timeout">超时设置</param>
            /// <param name="requestXML">参数</param>
            /// <param name="encoding">编码格式 例如:utf-8</param>
            /// <returns>HttpWebRequest</returns>
            public static HttpWebRequest GetHttpPostWebRequest(string requestUrl, int timeout, string requestXML,string encoding)
            {
                try
                {
                    encoding = encoding == "" ? "utf-8" : encoding;                //设置编码格式
                    byte[] bytes = System.Text.Encoding.GetEncoding(encoding).GetBytes(requestXML);  //将需要传递的参数用设置的编码格式转换为byte数组
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUrl);  //与get相同,根据url建立连接对象
                    request.Method = "POST";  //请求方法设置为post
                    request.Timeout = timeout * 1000;
                    request.ReadWriteTimeout = timeout * 1000;
                    request.Referer = requestUrl;
                    request.ContentType = "application/json";
                    request.ContentLength = bytes.Length;  //设置ContentLength HTTP标头
                    request.KeepAlive = false;
                    using (Stream requestStream = request.GetRequestStream()) //使用request对象,将参数写入流
                    {
                        requestStream.Write(bytes, 0, bytes.Length);
                        requestStream.Close();
                    }
                    return request;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

    POST方法返回与Get方法相同的HttpWebRequest,解读相应对象可以用上边Get相同的方法,

    也可使用异步方法:

    ==============================================================

     HttpWebRequest  request.BeginGetResponse(new AsyncCallback(saveWeightCallback), request);

    BeginGetResponse()中需要两个参数,第一个是委托AsyncCallback类型的回调函数。第二个参数是object类型。

    ////回调函数,有个IAsyncResult
    (待处理的响应请求。)
    类型的参数
    private
    void saveWeightCallback(IAsyncResult asyc) { try { string strResult = ComHelpClass.ResponseStr(asyc);     //调用解析方法,见下方 Dictionary<string, object> dic = JsonHelpClass.DeserializeStringToDictionary<string, object>(strResult);//将返回值转变成字典类型 if (bool.Parse(dic["success"].ToString())) { System.Windows.Forms.MessageBox.Show("保存成功"); } else { System.Windows.Forms.MessageBox.Show("保存失败"); } } catch (Exception ex) { } }
    ////解析方法
    public static string ResponseStr(IAsyncResult asyc) { string result = string.Empty; HttpWebRequest httpWebRequest = (HttpWebRequest)asyc.AsyncState;   //将回调函数传递进来的方法转换为HttpWebRequest对象 HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.EndGetResponse(asyc);//结束对Internet资源的异步请求。返回一个WebResponse,其中包含Internet资源的响应。 try { Encoding encoding = Encoding.GetEncoding("UTF-8"); using (StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream(), encoding)) { result = streamReader.ReadToEnd(); streamReader.Dispose(); } } catch (Exception ex) { throw ex; } finally { httpWebResponse.Close(); } return result; }

    ====================================================================================================

    代码摘自某大哥的一篇博客,但是找不到了,以后找到了补上

    创建一个web服务

    使用HttpListener对象

        
    /// <summary>
        /// 一个简单的Web Server实现
        /// 主要负责:
        /// 1.循环接收来自客户端(浏览器)的请求
        /// 2.将请求转给对应的处理者(处理者在第三方编写的网站程序中,通过反射去寻找)
        /// Web Server的作用类似一个“泵”
        /// 整个代码不足70行
        /// </summary>
        class Program
        {
            static IZRouter _router;  //路由器
            static IZHandler _handler;  //请求处理者
    
            //这个可以设置成配置项,这样的话,Web Server就可以灵活与各种网站程序交互
            //注意网站dll文件名、命名空间等均应与website_name相同。如果需要更加灵活,可以增加配置项,分别配置“网站名称”、“网站dll文件名称”、“命名空间(子命名空间)名称”等
            static string website_name = "MyWebsite"; 
    
            static void Main(string[] args)
            {
                HttpListener httpListener = new HttpListener();
                httpListener.Prefixes.Add("http://+:8081/");
                httpListener.Start();
                httpListener.BeginGetContext(new AsyncCallback(OnGetContext), httpListener);  //开始异步接收request请求
                Console.WriteLine("监听端口:8081...");
                Console.Read();
            }
            static void OnGetContext(IAsyncResult ar)
            {
                HttpListener httpListener = ar.AsyncState as HttpListener;
                HttpListenerContext context = httpListener.EndGetContext(ar);  //接收到的请求context(一个环境封装体)
    
                httpListener.BeginGetContext(new AsyncCallback(OnGetContext), httpListener);  //开始 第二次 异步接收request请求
    
    
                /*-------------------------开始处理请求-----------------------------*/
                HttpListenerRequest request = context.Request;  //接收的request数据
                HttpListenerResponse response = context.Response;  //用来向客户端发送回复
    
                //以下开始与 开发者编写的Web网站程序交互
                if (_router == null)  //找网站中的路由器
                {
                    Assembly assemble = Assembly.LoadFile(Environment.CurrentDirectory + "\web\" + website_name + ".dll"); //加载web目录下的网站程序
                    Type type = assemble.GetType(website_name+".Router");  //注意网站程序中的路由器必须命名为 ns.Router
                    _router = Activator.CreateInstance(type) as IZRouter;  //创建路由器的实例
                }
    
                _handler = _router.GetHandler(request.Url.AbsolutePath);  //根据路由器,找web网站中对应的处理者
                if (_handler != null)
                {
                    _handler.HandleRequest(request, response);   //开始处理请求(代码运行流程进入web网站程序)
                }
            }
        }
    /// <summary>
        /// 路由接口,根据url找到对应的请求处理者
        /// </summary>
        public interface IZRouter
        {
            IZHandler GetHandler(string url);
        }
    
        /// <summary>
        /// 请求处理接口,根据传进来的request、response处理请求并返回处理结果
        /// </summary>
        public interface IZHandler
        {
            void HandleRequest(HttpListenerRequest reqeust, HttpListenerResponse response);
        }
    /// <summary>
        /// 每个网站程序必备的路由器,命名必须为Router。该路由器将为每个URL找到对应的处理者
        /// </summary>
        public class Router : IZRouter
        {
    
            #region IZRouter 成员
    
            public IZHandler GetHandler(string url)
            {
                //根据URL格式  找到对应的处理者
                //此处简单匹配,完全为了举例
                if (url.EndsWith("/news"))
                {
                    return new MyNewsHandler();
                }
                else if (url.EndsWith("/users"))
                {
                    return new MyUsersHandler();
                }
                else if (url.EndsWith("/"))
                {
                    return new MyIndexHandler();
                }
                //...
                return null;
            }
    
            #endregion
        }

    HttpWebResponse类继承自WebResponse类,专门处理从WEB服务器返回的HTTP响应,这个类实现了很多方法,具有很多属性,可以全面处理接收到的互联网信息。在HttpWebResponse类中,对于大多数通用的HTTP标头字段,都有独立的属性与其对应,程序员可以通过这些属性方便的访问位于HTTP接收报文标头字段中的信息,本例中用到的HttpWebResponse类属性为:ContentLength 既接收内容的长度。

    这一段摘自:CSDN博主「iBenxiaohai123」的原创文章

  • 相关阅读:
    MongoDB
    Django配置实现数据库读写分离
    基于scrapy-redis的分布式爬虫
    增量式爬虫
    Pyhton网络爬虫之CrawlSpider
    Scrapy 之如何发送post请求
    Scrapy 之settings配置
    Scrapy 实现爬取多页数据 + 多层url数据爬取
    Scrapy 框架入门简介
    redis操作总结
  • 原文地址:https://www.cnblogs.com/big-lll/p/12452002.html
Copyright © 2020-2023  润新知