一 简介

HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的最好选择。它们支持一系列有用的属性。这两个类位 于System.Net命名空间,默认情况下这个类对于控制台程序来说是可访问的。请注意,HttpWebRequest对象不是利用new关键字通过构 造函数来创建的,而是利用工厂机制(factory mechanism)通过Create()方法来创建的。另外,你可能预计需要显式地调用一个“Send”方法,实际上不需要。接下来调用 HttpWebRequest.GetResponse()方法返回的是一个HttpWebResponse对象。你可以把HTTP响应的数据流 (stream)绑定到一个StreamReader对象,然后就可以通过ReadToEnd()方法把整个HTTP响应作为一个字符串取回。也可以通过 StreamReader.ReadLine()方法逐行取回HTTP响应的内容。

二 场景

就像上面所说的那样这两个对象的传输都是以流的方式在网络中传输的,如果我想要从客户端向服务器发送一个实体对象的数据该怎么解决呢?可能有的人说使用wcf等通信技术,但是对于我的应用场景来说有点小题大做,于是在网上找了点资料,实现了基于HttpWebReques的数据对象的传输。

三 具体实现

首先,创建需要传输的实体类PostParameters,这个实体类中有两个属性,一个是要传输的文件的文件流,另一个是文件路径(当然,因为我的需求是要上传图片的,没有做过多的扩展,后缀名,文件格式等的需求,可以根据自己的需求去做扩展)

public class PostParameters
{
// public string Name { get; set; }
public Stream FStream { get; set; }
public string Path { get; set; }
}

下面是客户端的代码,利用HttpWebRequest传输实体对象数据

using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using Newtonsoft.Json; namespace AshxRequestTest
{
internal class Program
{
private static void Main(string[] args)
{
PostJson("http://uploadimg.zhtx.com/UploadImagHandle.ashx", new PostParameters
{
Path = "hahah"
});
} private static void PostJson(string uri, PostParameters postParameters)
{
string postData = JsonConvert.SerializeObject(postParameters); //将对象序列化
byte[] bytes = Encoding.UTF8.GetBytes(postData); //转化为数据流
var httpWebRequest = (HttpWebRequest) WebRequest.Create(uri); //创建HttpWebRequest对象
httpWebRequest.Method = "POST";
httpWebRequest.ContentLength = bytes.Length;
httpWebRequest.ContentType = "text/xml";
using (Stream requestStream = httpWebRequest.GetRequestStream())
{
requestStream.Write(bytes, , bytes.Count()); //输出流中写入数据
}
var httpWebResponse = (HttpWebResponse) httpWebRequest.GetResponse(); //创建响应对象
if (httpWebResponse.StatusCode != HttpStatusCode.OK) //判断响应状态码
{
string message = String.Format("POST failed. Received HTTP {0}", httpWebResponse.StatusCode);
throw new ApplicationException(message);
}
}
}
}

注释写的很清楚,

下面是服务端的代码:

using System;
using System.IO;
using System.Text;
using System.Web;
using Newtonsoft.Json; namespace HttpWebClientTest
{
/// <summary>
/// UploadImagHandle 的摘要说明
/// create by peng.li 2015-5-30
/// </summary>
public class UploadImagHandle : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/xml";
HandleMethod();
// context.Response.Write("Hello World");
} public bool IsReusable
{
get { return false; }
} private static void HandleMethod()
{
HttpContext httpContext = HttpContext.Current;
Stream httpRStream = httpContext.Request.InputStream;
var bytes = new byte[httpRStream.Length];
httpRStream.Read(bytes, , bytes.Length); //读取请求流对象
string req = Encoding.Default.GetString(bytes); //转换成字符串对象(这个字符串是json格式的)
var postParameters = JsonConvert.DeserializeObject<PostParameters>(req); //(反序列化)
int res = UploadImage(postParameters);
httpContext.Response.Write(res);
} public static int UploadImage(PostParameters postParameters)
{
string path = "E:/" + postParameters.Path;
try
{
if (!Directory.Exists(Path.GetDirectoryName(path)))
{
Directory.CreateDirectory(Path.GetDirectoryName(path));
}
File.WriteAllBytes(path, postParameters.FileByte);
return ;
}
catch (Exception)
{
return ;
}
}
}
}

这只是一个小的demo,希望能够起到抛砖引玉的作用,当然有表达错误的地方,也希望大家能指出来,一块学习,一块进步。

本人的.NET学习技术交流群:226704167

另附上demo下载链接:http://files.cnblogs.com/files/lip0121/HttpWebClientTestPostJson.rar

利用HttpWebRequest实现实体对象的上传的更多相关文章

  1. 利用jquery+iframe做一个ajax上传效果

    以下是自学it网--中级班上课笔记 网址:www.zixue.it html页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict ...

  2. base64格式图片转换为FormData对象进行上传

    原理:理由ArrayBuffer.Blob和FormData var base64String = /*base64图片串*/; //这里对base64串进行操作,去掉url头,并转换为byte va ...

  3. win7下利用ftp实现华为路由器的上传和下载

    win7下利用ftp实现华为路由器的上传和下载 1.  Win7下ftp的安装和配置 (1)开始->控制面板->程序->程序和功能->打开或关闭Windows功能 (2)在Wi ...

  4. JavaScript把项目本地的图片或者图片的绝对路径转为base64字符串、blob对象在上传

    主题: JavaScript把项目本地的图片或者图片的绝对路径转为base64字符串.blob对象在上传. 用处: 从本地选择图片上传,如项目规定只能选择本项目文件夹下的图像上传为头像等. 主要思想: ...

  5. 利用WCF与Android实现图片上传并传参

    利用WCF与Android实现图片上传并传参 最近做一个项目后端使用WCF接收Android手机拍照并带其它参数保存到服务器里:刚好把最近学习的WCF利用上,本以为是个比较简单的功能应该很好实现,没想 ...

  6. 利用spring的MultipartFile实现文件上传【原】

    利用spring的MultipartFile实现文件上传 主要依赖jar包 spring-web-3.0.6.RELEASE.jar 用到 (org.springframework.web.multi ...

  7. 利用Java API通过路径过滤上传多文件至HDFS

    在本地文件上传至HDFS过程中,很多情况下一个目录包含很多个文件,而我们需要对这些文件进行筛选,选出符合我们要求的文件,上传至HDFS.这时就需要我们用到文件模式. 在项目开始前,我们先掌握文件模式 ...

  8. 利用Bootstrap简单实现一个文件上传进度条

    © 版权声明:本文为博主原创文章,转载请注明出处 说明: 1. 使用commons-fileupload.jar实现文件上传及进度监听 2. 使用bootstrap的进度条进行页面显示 3. 因为进度 ...

  9. 利用exif.js解决ios手机上传竖拍照片旋转90度问题

    html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非 ...

随机推荐

  1. 利用KD树进行异常检测

    软件安全课程的一次实验,整理之后发出来共享. 什么是KD树 要说KD树,我们得先说一下什么是KNN算法. KNN是k-NearestNeighbor的简称,原理很简单:当你有一堆已经标注好的数据时,你 ...

  2. HTML5简介

    HTML5简介 HTML5是HTML的最新修订标准.2014年10月29日,万维网联盟(W3C)宣布,经过8年的努力,HTML5标准规范制定完成. HTML5的设计目的是在移动设备上使用多媒体. HT ...

  3. java访问修饰符

    了解面向对象思想的同学们,都知道"封装"这一基本特征,如何正确运用访问修饰符,恰恰能体现出封装的好坏. java访问修饰符有四个: 1)public:访问权限最高,其修饰的类.类变 ...

  4. intellij idea 15 修改基础配置加载路径

    一.概述 intellij idea 15 默认配置的启动加载路径是"C:\Users\Administrator.IntelliJIdea15",这样会导致占用C盘的空间越来越多 ...

  5. PDO运用

  6. JS高程4.变量,作用域和内存问题(1)

    1.基本类型和应用类型的值 ECMAScript变量可能包含两种不同数据类型的值: 基本类型值--简单的数据段.(5种基本的数据类型,按值访问,因为可以操作保存在变量中的实际的值.) 引用类型值--多 ...

  7. 在js中为图片的src赋值时,src的值不能在开头用 破浪号~

    <img id="aa" src="~/Content/Manager/no01.png" /> document.getElementById(& ...

  8. oracle rman catalog备份和恢复

    1.丢失控制文件      启动数据库至nomount状态:restore controlfile from autobackup/restore controlfile from '+data/ba ...

  9. CentOS7系统安装及初始化

    1.运行VirtualBox5. 2.安装CentOS7系统. 注意:选择Basic Server类型 安装过程略. 3.修改计算机IP和计算机名. 1)nmtui 1.修改主机名: nmcli ge ...

  10. ipad和iphone的适配

    关于xib或者storybord下iphone的横竖屏的适配以及ipad的适配 ios8出现了Size Classes,解决了各种屏幕适配的问题,他把屏幕的宽和高分别分成了三种,把屏幕总共分成了九种情 ...