C# HttpWeb POST请求封装

2023-05-16

用于发送POST请求,可以发送各种POST参数、传送文件,返回结果、下载文件。
说明如下:

public static string HttpPost(
    OnHttpPostProgress onProgress, //上传或下载进度,不需要可以传NULL
    string url, // 请求的URL地址
    Dictionary<string,string> post = null, //要发送的参数,可以发送键值对、数组、对象等复杂数据
    string toFile = null, //如果指定了一个路径,请求结果保存为文件,如果传NULL,直接返回查询结果
    string upFile = null, //要上传的文件,传NULL不上传文件
    string fileField=null //默认为upFile,即PHP接收时使用$_FILE['upFile']
);
public static class HttpWeb
    {
        /// <summary>
        /// HTTP 进度事件
        /// </summary>
        /// <param name="bUpload">TRUE为上传进度,FALSE为下载进度</param>
        /// <param name="lFininsh">已完成大小</param>
        /// <param name="lTotal">总共大小</param>
        public delegate void OnHttpPostProgress(bool bUpload, long lFininsh, long lTotal);

        /// <summary>
        /// 发送Post请求
        /// </summary>
        /// <param name="onProgres">上传或下载进度改变时</param>
        /// <param name="url">URL地址</param>
        /// <param name="post">键值对,如果要发送数组,请参考:"man[0][name]"=>"hexu"; "man[0][age]", "18"); "man[1][name]"=>"hexu"; "man[1][age]", "18");如果不发送数据,可以传NULL</param>
        /// <param name="toFile">结果保存至文件,如果为NULL,则直接返回结果</param>
        /// <param name="file">要发送的文件路径</param>
        /// <param name="fileField">文件上传字段名字</param>
        /// <returns></returns>
        public static string HttpPost(OnHttpPostProgress onProgress, string url, Dictionary<string, string> post = null, string toFile = null, string upFile = null, string fileField = null)
        {
            string result = null;
            try
            {
                //FileStream ws = null;
                string boundary = "------------" + DateTime.Now.Ticks.ToString();
                byte[] tailBoundary = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--");

                HttpWebRequest hwr = WebRequest.Create(url) as HttpWebRequest;

                hwr.Method = "POST";
                hwr.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
                hwr.Proxy = null;
                hwr.ProtocolVersion = HttpVersion.Version10;
                hwr.KeepAlive = true;
                hwr.Timeout = -1;
                hwr.ReadWriteTimeout = -1;
                hwr.AllowWriteStreamBuffering = false;

                long fileSize = 0;
                StringBuilder sb = new StringBuilder();

                if (post != null)
                {
                    bool bFirst = true;
                    foreach (var pam in post)
                    {
                        if (bFirst)
                            bFirst = false;
                        else
                            sb.Append("\r\n");

                        sb.Append("--");
                        sb.Append(boundary);
                        sb.Append("\r\n");
                        sb.Append("Content-Disposition: form-data; name=\"");
                        sb.Append(pam.Key);
                        sb.Append("\"\r\n\r\n");
                        sb.Append(pam.Value);
                    }
                }

                if (!string.IsNullOrWhiteSpace(upFile))
                {
                    FileInfo fi = new FileInfo(upFile);
                    if (!fi.Exists)
                        throw new Exception("File Not Found");
                    fileSize = fi.Length;
                    fi = null;

                    if (fileField == null)
                        fileField = "upFile";
                    if ( post != null && post.Count > 0)
                        sb.Append("\r\n");
                    sb.Append("--");
                    sb.Append(boundary);
                    sb.Append("\r\n");
                    sb.Append("Content-Disposition: form-data; name=\"");
                    sb.Append(fileField);
                    sb.Append("\"; filename=\"");
                    sb.Append(Path.GetFileName(upFile));
                    sb.Append("\"\r\n");
                    string expName = Path.GetExtension(upFile);
                    if ((string.Compare(expName, ".xls", true) == 0) || (string.Compare(expName, ".xlsx", true) == 0))
                        sb.Append("Content-Type: application/vnd.ms-excel");
                    else
                        sb.Append("Content-Type: application/octet-stream");
                    sb.Append("\r\n\r\n");
                }

                byte[] partOne = Encoding.UTF8.GetBytes(sb.ToString());

                long totalSize = partOne.Length + fileSize + tailBoundary.Length;
                long progressSize = 0;

                hwr.ContentLength = totalSize;

                using (Stream pstStream = hwr.GetRequestStream())
                {
                    DateTime dtLastInvoke = DateTime.MinValue;

                    pstStream.Write(partOne, 0, partOne.Length);
                    progressSize += partOne.LongLength;

                    if (onProgress != null)
                    {
                        dtLastInvoke = DateTime.Now;
                        onProgress.BeginInvoke(true, progressSize, totalSize, null, null);
                    }

                    if (fileSize > 0)
                    {
                        using (FileStream fs = new FileStream(upFile, FileMode.Open, FileAccess.Read))
                        {
                            using (BinaryReader br = new BinaryReader(fs))
                            {
                                byte[] buffers = new byte[4096];
                                int size = br.Read(buffers, 0, 4096);
                                while (size > 0)
                                {
                                    pstStream.Write(buffers, 0, size);
                                    progressSize += size;

                                    if (onProgress != null)
                                    {
                                        DateTime dtNow = DateTime.Now;
                                        if (dtNow.Subtract(dtLastInvoke).TotalMilliseconds >= 500)
                                        {
                                            dtLastInvoke = dtNow;
                                            onProgress.BeginInvoke(true, progressSize, totalSize, null, null);
                                        }
                                    }
                                    size = br.Read(buffers, 0, 4096);
                                }
                                br.Close();
                            }
                            fs.Close();
                        }
                    }
                    pstStream.Write(tailBoundary, 0, tailBoundary.Length);
                    pstStream.Flush();
                    pstStream.Close();

                    if (onProgress != null)
                        onProgress.BeginInvoke(true, progressSize, totalSize, null, null);
                }
                using (HttpWebResponse response = hwr.GetResponse() as HttpWebResponse)
                {
                    totalSize = response.ContentLength;
                    progressSize = 0;
                    DateTime dtLastInvoke = DateTime.Now;

                    using (Stream resStream = response.GetResponseStream())
                    {
                        if (string.IsNullOrWhiteSpace(toFile))
                        {
                            using (StreamReader sr = new StreamReader(resStream))
                            {
                                StringBuilder sbr = new StringBuilder();
                                char[] buff = new char[1024];
                                int size = sr.Read(buff, 0, 1024);
                                while (size > 0)
                                {
                                    for (int i = 0; i < size; ++i)
                                        sbr.Append(buff[i]);

                                    progressSize += size;
                                    if (onProgress != null)
                                    {
                                        DateTime dtNow = DateTime.Now;
                                        if (dtNow.Subtract(dtLastInvoke).TotalMilliseconds >= 500)
                                        {
                                            dtLastInvoke = dtNow;
                                            onProgress.BeginInvoke(false, progressSize, totalSize, null, null);
                                        }
                                    }
                                    size = sr.Read(buff, 0, 1024);
                                }
                                sr.Close();
                                result = sbr.ToString();
                            }
                        }
                        else
                        {
                            using (BinaryReader sr = new BinaryReader(resStream))
                            {
                                using (FileStream ws = new FileStream(toFile, FileMode.Create, FileAccess.ReadWrite))
                                {
                                    int size = 0;
                                    byte[] buff = new byte[1024];
                                    size = sr.Read(buff, 0, 1024);
                                    while (size > 0)
                                    {
                                        ws.Write(buff, 0, size);

                                        progressSize += size;
                                        if (onProgress != null)
                                        {
                                            DateTime dtNow = DateTime.Now;
                                            if (dtNow.Subtract(dtLastInvoke).TotalMilliseconds >= 500)
                                            {
                                                dtLastInvoke = dtNow;
                                                onProgress.BeginInvoke(false, progressSize, totalSize, null, null);
                                            }
                                        }
                                        size = sr.Read(buff, 0, 1024);
                                    }
                                    ws.Close();
                                }
                                sr.Close();
                                result = "success";
                            }
                        }
                    }
                }

                if (onProgress != null)
                {
                    onProgress.BeginInvoke(false, progressSize, totalSize, null, null);
                }
            }
            catch (Exception e)
            {
                result = e.Message;
            }
            return result;
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# HttpWeb POST请求封装 的相关文章

  • 使用 PHP 将表单数据发送/发布到 URL [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有一个通过 POST 提交的表单 提交表单后我捕获变量 如何连接表单数据 然后将其 POST 到 url 然后重新定向到感谢页面 这不是确
  • MS Access 执行 POST Web 请求

    在我的 MS Access 应用程序中 我需要定期向我的网络服务器发送一批信息 我不需要任何花哨的东西 比如 SOAP XML RPC 或任何东西 只需一个简单的 POST 页面请求就足够了 我用谷歌搜索了一下 但找不到任何真正有用的东西
  • 使用python将json和文件发送到flask

    我遇到这个问题 我试图在单个函数中向 Flask API 发送 接收一些文件和 JSON 在我的客户端 发件人 上我有 my json to be sent datas var1 var1 var2 var2 my file to be s
  • Android httpclient文件上传数据损坏和超时问题

    我在 Android 中上传图像时遇到问题 我正在使用 apache httpmime 4 1 lib 代码是这样的 MultipartEntity reqEntity new MultipartEntity HttpMultipartMo
  • 改造中如何使用HashMap发布数据?

    您能解释一下如何使用以下方式发布数据吗hashmap in 改造2 这就是我发的帖子 FormUrlEncoded POST getProfile Call
  • 简单 php 脚本找不到对象错误

    每次我点击提交按钮在网页中处理此代码时 它都会转到 未找到对象 404 错误 页面 它发生在我的一些脚本中 我不知道问题的根源是我的本地主机 Xampp 还是我的代码 if isset POST submit require dbc php
  • 如何让 IE 以 UTF-8 格式发布 FORM 数据?

    这是这个问题的延续 Java Jersey 以字节数组形式接收表单参数 https stackoverflow com questions 6282626 java jersey receive form parameter as byte
  • $_POST 最大数组大小

    我有一个非常大的表单 有 gt 1000 个元素 它们已经嵌套在表单 html 结构中 foreach from result item item tr td td tr
  • HTTP 错误 415 我做错了什么?

    我正在发送 SOAP POST 但收到 HTTPError HTTP 错误 415 不支持的媒体类型 response urllib2 urlopen req data
  • php:验证 POST 的最佳方法

    我一直在使用下面的代码来验证 POST 的用户输入 if isset POST name empty POST name n POST name else errors Please give a name 这段代码检查是否确实设置了 na
  • 在 Go 中读取请求负载?

    我正在使用文件上传器 需要请求负载中的详细信息来裁剪它 func Upload w http ResponseWriter r http Request reader err r MultipartReader if err nil htt
  • 使用 POST 的 HttpWebRequest 的性能

    我有一个用于测试网络服务的小工具 它可以使用 POST 或 GET 调用 Web 服务 使用POST的代码是 public void PerformRequest WebRequest webRequest WebRequest Creat
  • 为什么在发出带有发布数据的请求后,PHP 中的 $_POST 数组为空

    我使用发布数据向页面 getremote php 发出发布请求 但 POST 数组似乎为空 如果有人能告诉我我做错了什么 我将不胜感激 发出请求的 JavaScript 代码是 var postdata Content Type appli
  • Angular2 http.post 被执行两次

    我遇到一个奇怪的问题 Angular2 的 RC1 Http 服务执行 http post 调用两次 我已经调试了我的应用程序 并且我知道这不是点击事件问题 导致核心服务调用的所有调用 public create json Object p
  • DefaultHttpClient GET 和 POST 命令 Java Android

    好的 这是我的应用程序 一个 Android 应用程序 允许我从移动应用程序 而不是从网站 将 CokeZone 代码提交到 CokeZone co uk 所以我编写了这部分代码来执行登录后命令 然后检查我是否登录后 问题是 发送 post
  • HttpRequest消息 POST

    我正在尝试发送json https www json org 样式 字符串通过Http响应消息 https msdn microsoft com en us library system net http httprequestmessag
  • $_POST 不包含所有数据

    几天前 我们的一家网上商店遇到了问题 Gambio基于xtC 我们有一个包含 3000 多个文本字段的公式 其中大约前三分之一工作正常 其余的都是空的 看来 POST 已正确填充 但在服务器上 应用程序获得了一个缩减的数组 我在不同的计算机
  • 在 WebView 中拦截 POST 请求

    我正在开发一个 Android 应用程序来过滤请求 使用白名单 并使用自定义SSLSocketFactory 为此 我开发了一个自定义的WebViewClient我已经覆盖了shouldInterceptRequest方法 我可以过滤并使用
  • Access-Control-Allow-Headers 不允许请求标头字段 Access-Control-Allow-Headers

    我试图通过发布请求将文件发送到我的服务器 但是当它发送时会导致错误 Access Control Allow Headers 不允许请求标头字段 Content Type 所以我用谷歌搜索了错误并添加了标题 http post rootSc
  • 如何在 PHP 中使用 cURL 发出同时包含 GET 和 POST 参数的请求?

    其他人已经问过如何从 perl java bash 等执行此操作 但我需要在 PHP 中执行此操作 并且我没有看到任何已提出的专门与 PHP 相关的问题 或包含 PHP 的答案 My code ch curl init url curl s

随机推荐

  • SPARC体系下硬浮点编译故障分析

    问题说明 之前extension版的app工程都是用的软浮点编译的 xff0c 在增加姿控算法库后 xff0c 统一改用硬浮点运行 xff0c 发现之前一个浮点数解析不对了 xff0c 排查发现和工程编译选项有关 xff0c 为软浮点时正常
  • SylixOS下DNS配置

    SylixOS下支持DNS xff08 域名解析 xff09 服务 xff0c 既可以通过域名地址来访问网络地址 测试 先进行一个域名解析的测试 xff1a 由上图可知 xff0c 在其他网络配置正确的情况下 xff0c SylixOS可以
  • SylixOS 教培官网上线

    4月末翼辉创建的包括SylixOS教培在内的文档中心已上线 今天SylixOS教培又上线了 Shell 命令手册 和 IDE 使用手册 方便大家学习和查阅SylixOS相关知识点 SylixOS教培官网 https docs acoinfo
  • SylixOS App 运行时出现“vprocRun() error: can not find entry function.”错误提示原因及解决方法

    针对只使用静态库 xff0c 不使用共享库的业务场景 xff0c 如果libsylixos Output目录下的 libvpmpdm so文件被删除 xff0c SylixOS App程序将自动连接libvpmpdm a文件 xff0c 这
  • 【无标题】

    环境变量 xff08 environment variables xff09 是一组键值对 xff08 key 61 value xff09 列表 xff0c 每一项键值对为一个环境变量 xff0c 分环境变量名和环境变量值 xff0c 两
  • c#爬虫-1688官网自动以图搜图

    背景 在1688有个功能 xff0c 就是上传图片 xff0c 就可以找到类似的商品 如下 网址 xff1a https www 1688 com 这时候 xff0c 我们可以使用程序来代替 xff0c 大批量的完成图片上传功能 实现思路
  • 关于大端序和小段序

    Most Significant Byte 指多字节序列中具有最大权重的 字节 wiki中的解释 xff1a Most Significant Bit 是指一个n位 二进制数字中的n 1位 xff0c 具有最高的权值 与之相反的称之为最低有
  • 使用Project进行项目管理

    文章目录 1 Project可以做哪些 xff1f 1 1 功能清单1 2 本文将会涉及到的内容 2 常见操作2 1 设置 xff1a 自动任务2 2 设置 xff1a 任务的时间格式2 3 日历设置 xff1a 项目开始时间2 4 日历设
  • 进销存小程序(一)项目整体功能和设计

    文章目录 1 设计目标2 功能点说明2 1 首页2 2 登陆2 2 1 微信用户和当前用户绑定的过程2 2 2 获取用户信息 2 3 创建店铺2 4 加入店铺2 5 创建商品2 6 商品信息修改2 7 入库管理2 8 出库管理2 9 库存盘
  • Tomcat的appBase,docBase,path关系

    文章目录 1 结论在最前面2 server xml关于appbase和context配置2 1 war包在webapps目录下 xff1b appbase 61 34 webapps 34 xff1b 无context配置2 2 war包在
  • ubuntu 18.04 LTS 安装搜狗输入法

    首先安装 fcitx xff0c 再安装搜狗输入法 一 检测是否安装fcitx 首先检测是否有 fcitx xff0c 因为搜狗拼音依赖fcitx 在终端中输入 fcitx xff0c 检查 fcitx 是否已有 fcitx 提示 xff1
  • Activiti之一:部署activiti-admin、activiti-app、activiti-rest

    文章目录 各组件版本下载部署将war包放入tomcat 访问 在网上查找activiti相关资料 xff0c 发现对于activiti rest的使用很少 xff0c 而官网对于api的支持还是比较多的 xff0c 如果考虑的是一个纯粹的工
  • 基于mongodb的动态表单实现

    文章目录 1 项目背景2 术语表3 技术选型4 概要设计4 1 逻辑架构图4 2 系统覆盖图 5 详细设计5 1 元数据样例及说明5 2 关于uuid 6 接口清单6 1 表单管理模块6 1 1 从excel导入表单元数据6 1 2 表单元
  • 10.9.1-Dataway+Echarts动态图表方案

    文章目录 1 技术选型2 实现方案2 1 方案介绍2 2 方案实现 xff08 demo xff09 2 2 1 使用echarts绘制html静态页2 2 1 1 选择合适的图表2 2 1 2 下载html demo 2 2 2 使用Da
  • 11.1-股票基金历年收益率计算

    文章目录 1 计算目标2 关键问题3 获取交易日历4 逻辑编写 1 计算目标 我们想知道 xff0c 一只股票标的 xff0c 在之前的几年中 xff0c 每一年的年化收益率是多少 xff1f 如果将每年的年化收益率进行求和汇总 xff0c
  • java代理实现爬取代理IP

    仅仅使用了一个java文件 xff0c 运行main方法即可 xff0c 需要依赖的jar包是com alibaba fastjson xff08 版本1 2 28 xff09 和Jsoup xff08 版本1 10 2 xff09 如果用
  • 使用proguard进行javaweb代码混淆

    背景 xff1a 公司需要将软件打包出售 xff0c 此时需要进行代码混淆和一些加密要求 调研 xff1a 目前此类实现包含软件和硬件实现 xff1b 硬件实现是使用类似加密狗usb工具进行防护 xff0c 应用系统通过与加密狗交互 xff
  • 使用说明-Postman-带cookie请求、文件上传

    Postman进行文件上传 选择post方式 xff0c 地址是http 192 168 102 213 7240 foa system upload Headers部分不要填写任何内容 对照后台的接口 xff0c 配置postman 选择
  • CentOS7下使用docker,完成Jenkins镜像、tomcat镜像制作和启动

    最终的目的 xff0c 是为了完成docker环境的Jenkins搭建使用 xff0c 并从gitlab上获取代码 xff0c 打出war包 xff0c war包通过目录挂载的方式 xff0c 在tomcat容器中使用 xff0c 总体思路
  • C# HttpWeb POST请求封装

    用于发送POST请求 xff0c 可以发送各种POST参数 传送文件 xff0c 返回结果 下载文件 说明如下 xff1a span class hljs keyword public span span class hljs keywor