欢迎来到阿里云授权服务中心典名科技有限公司!咨询电话:023-66887777 18623333330

微信
手机版
网站地图

C#怎么利用http协议与服务器通信

2021-08-19 10:03:17 投稿人 : admin 围观 : 118 次 0 评论

“C#怎么利用http协议与服务器通信”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么利用http协议与服务器通信”吧!

image.png

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Collections;

using System.Net;

using System.IO;

namespace www.xinduofen.cn

{

    /// <summary>

    /// C#与http服务器端进行对接的工具类

    /// </summary>

    class HttpWebTool

    {

        /// <summary>

        /// 用于缓存服务器端传输到客户端的SESSIONID或者JSESSIONID

        /// </summary>

        private Cookie sessionidCookie = null;

        /// <summary>

        /// 从HttpWebServer端获取数据(使用的是"post"方式)

        /// </summary>

        /// <param name="url">请求网址</param>

        /// <param name="data">请求参数集合,无需参数时传入null值</param>

        /// <param name="cookies">请求cookie集合,无需cookie时传入null值</param>

        /// <returns>返回请求结果字符串,返回为null代表请求失败</returns>

        public String getDatafromHttpWebServer(String url, Hashtable data,CookieCollection cookies)

        {

            String result = null;

            if (string.IsNullOrEmpty(url))

            {

                return null;//传入参数异常

            }

            byte[] data_stream = null;//将要向服务器传输的数据流内容

            if (data != null && data.Count > 0)

            {

                string transportData = "";//将要向服务器传输的字符串内容

                foreach (DictionaryEntry de in data)

                {

                    transportData = transportData + de.Key.ToString() + "=" + de.Value.ToString() + "&";//解调出键值对数据

                }

                transportData = transportData.TrimEnd('&');//去除字符串尾部的 &

                if (!string.IsNullOrEmpty(transportData))

                {

                    data_stream = Encoding.UTF8.GetBytes(transportData);//将上传字符串数据打包成数据流

                }

            }

            try

            {

                HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);

                //请求方式

                req.Method = "POST";

                //声明客户端只接收txt类型的内容

                req.Accept = "text/plain";

                //以键值对形式向服务器传递参数

                req.ContentType = "application/x-www-form-urlencoded";

                //设置cookie盒子(客户端请求的cookie和服务器端返回的cookie就放在此盒子中)

                CookieContainer cookieContainer = new CookieContainer();

                if (sessionidCookie != null && !string.IsNullOrEmpty(sessionidCookie.Domain))

                {

                    cookieContainer.Add(sessionidCookie);

                }

                if (cookies!=null)

                {

                    cookieContainer.Add(cookies);//添加调用者传入的cookie集合

                }

                req.CookieContainer = cookieContainer;

                if (data_stream != null && data_stream.Length > 0)

                {

                    //请求数据流的长度

                    req.ContentLength = data_stream.Length;

                    using (Stream requestStream = req.GetRequestStream()) {

                        //写入请求实体流

                        requestStream.Write(data_stream, 0, data_stream.Length);

                    }

                }

                //接收返回值

                using(HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse()){

                    using (StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8))

                    {

                        result = reader.ReadToEnd().Trim();

                    }

                    if (myResponse.Cookies["SESSIONID"] != null)

                    {

                        sessionidCookie = myResponse.Cookies["SESSIONID"];

                    }

                    else

                    {

                        if (myResponse.Cookies["JSESSIONID"] != null)

                        {

                            sessionidCookie = myResponse.Cookies["JSESSIONID"];

                        }

                    }

                }

            }catch(Exception){

                Console.WriteLine("请查看传入参数是否正确或者服务器是否关闭");

            }

            return result;

        }

        /// <summary>

        /// 获得参数data的消息数据流,以"\r\n"结尾

        /// </summary>

        /// <param name="data">请求参数集合,无需参数时传入null值</param>

        /// <param name="boundary">消息分隔符</param>

        /// <returns>返回参数data的数据流,返回为空代表获得失败</returns>

        private byte[] getParameterBytes(Hashtable data, String boundary)

        {

            byte[] parameterBytes = null;

            //如果有请求参数

            if (data != null && data.Count > 0)

            {

                string parameterStr = "";

                foreach (DictionaryEntry de in data)

                {

                    parameterStr += "--" + boundary;

                    parameterStr += "\r\n" + "Content-Disposition: form-data;name=\"" + de.Key.ToString() + "\"";

                    parameterStr += "\r\n" + "Content-Type: text/plain; charset=UTF-8";

                    parameterStr += "\r\n\r\n" + de.Value.ToString();

                    parameterStr += "\r\n";

                }

                if (!string.IsNullOrEmpty(parameterStr))

                {

                    parameterBytes = Encoding.UTF8.GetBytes(parameterStr);//将上传字符串数据打包成数据流

                }

            }

            return parameterBytes;

        }

        /// <summary>

        /// 获得上传文件的消息头部分字符流,以"\r\n\r\n"结尾

        /// </summary>

        /// <param name="de">上传文件《控件名,上传文件的保存位置(包括"文件名"."扩展名")》</param>

        /// <param name="boundary">消息分隔符</param>

        /// <returns>返回上传文件的消息头部分字符流,返回会为null代表获得失败</returns>

        private byte[] getUploadFileDeclareBytes(DictionaryEntry de, String boundary)

        {

            byte[] uploadFileDeclareBytes = null;

            //上传文件的消息头描述部分

            string uploadFileDeclareStr = "";

            uploadFileDeclareStr += "--" + boundary;

            uploadFileDeclareStr += "\r\n" + "Content-Disposition: form-data;name=\"" + de.Key.ToString() + "\"; filename=\"" + de.Value.ToString() + "\"";

            uploadFileDeclareStr += "\r\n" + "Content-Type: application/octet-stream";

            uploadFileDeclareStr += "\r\n\r\n";

            if (!string.IsNullOrEmpty(uploadFileDeclareStr))

            {

                uploadFileDeclareBytes = Encoding.UTF8.GetBytes(uploadFileDeclareStr);//将上传字符串数据打包成数据流

            }

            return uploadFileDeclareBytes;

        }

    }

}


版权声明:本站部分文章内容、图片来源于网友推荐、互联网收集整理而来,仅供大家学习参考,不代表本站立场,如有侵权,请联系站长,我们会第一时间处理!本站原创内容未经允许不得转载,或转载时需注明出处:典名科技资讯门户

相关文章

  • 怎样弄linux查看进程的线程数?
    怎样弄linux查看进程的线程数?

      Linux系统的进程是由线程组成的,当然Linux进程下的线程数是不固定的,可以是一个进程,也可以是多个进程。下面就由和大家讲一讲linux查看进程。进程是一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源。一般来说,Li...

    2021-11-17 11:35:33
  • 云服务器的优势
    云服务器的优势

      基于云主机平台构建的一款新型云主机产品,其性能是云主机的性能,同时具备虚拟主机的全部功能。在主机控制面板上还具有服务器重启,CPU、内存、使用空间大小监控等功能。用户独享整个驰云服务器的软硬件资源,通过控制面板进行维护和管理,同时关闭远...

    2021-11-17 11:27:34
  • 微系统架构的特点
    微系统架构的特点

      微系统架构是一项在云中部署应用和服务的新技术。大部分围绕微服务的争论都集中在容器或其他技术是否能很好的实施微服务,而红帽说API应该是重点。微服务可以在“自己的程序”中运行,并通过“轻量级设备与HTTP型API进行沟通”。关键在于该服务...

    2021-11-17 11:20:34
  • 云建站有什么特点?
    云建站有什么特点?

      云建站是最近几年互联网领域兴起的全新的一种互联网基础应用模式,以前存放网站所有的服务器都是单击存在,各种服务之间没有明确的区分,来到云技术时代,随着虚拟化技术的进步,大规模集成式服务开始出现,由之前的单点式服务变为了集群式云服务,人们可...

    2021-11-17 11:13:35
  • 如何使用linux搭建vpn服务器?
    如何使用linux搭建vpn服务器?

      Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线...

    2021-11-17 11:09:36
  • 可靠云主机的优点和缺点
    可靠云主机的优点和缺点

      云主机是云计算在基础设施应用上的重要组成部分,位于云计算产业链金字塔底层,产品源自云计算平台。该平台整合了互联网应用三大核心要素:计算、存储、网络,面向用户提供公用化的互联网基础设施服务。云主机是一种类似VPS主机的虚拟化技术, VPS...

    2021-11-17 11:03:36
  • linux查看端口占用情况的步骤
    linux查看端口占用情况的步骤

      准备使用python写一个端口探测的小程序,以检测一些特定的服务端口有没有被占用,突然发现自己居然不知道在linux中如何查询端口被占用的情况,在项目的部署的时候,会遇到端口被占用的情况,需要我们先停下占用端口的进程,然后才能开启新的服...

    2021-11-17 11:01:36
  • tftp服务器软件特点有哪些?tftp服务器软件如何使用?
    tftp服务器软件特点有哪些?tftp服务器软件如何使用?

      tftp是一个传输文件的简单协议,而tftp服务器则可以用于IOS的升级和备份的工作,同时还可以用于文件的传输,现在有一种tftp服务器软件,很多朋友不知道它的情况,下面就来说说tftp服务器软件特点有哪些?tftp服务器软件如何使用。...

    2021-11-17 11:01:35
  • 传真服务器软件角色的步骤
    传真服务器软件角色的步骤

      Windows Server 2008 中的传真服务管理器提供了一个用于配置和管理传真资源的集中管理点。传真服务管理器是在服务器管理器中安装传真服务器角色时安装的。可以使用传真服务管理器为传入和传出传真流量配置传真设备、指定可以使用传真...

    2021-11-17 11:01:35
  • 什么服务器好用?选择服务器要注意什么问题?
    什么服务器好用?选择服务器要注意什么问题?

      什么服务器好用?选择服务器要注意什么问题?很多人在选择服务器产品时一味的看重内存大小,不关注品牌和售后服务问题,其实这个想法有失偏颇。建议大家在选择服务器时还要考虑到宽带以及机房等问题。   一、服务器是什么?   服务器是计算机的一种...

    2021-11-17 11:01:33
发表评论