- 浏览: 417432 次
-
文章分类
- 全部博客 (327)
- Android (114)
- Java (13)
- Java基础 (14)
- Glib (2)
- linux (15)
- extjs (5)
- eclipse (2)
- Asterisk (56)
- MYSQL (6)
- 数据库 (9)
- PHP (7)
- C# (18)
- 杂谈~~ (1)
- web开发前端 (3)
- 网络编程 (2)
- Opensips (2)
- voip (3)
- debian (7)
- openfire (15)
- wordpress (1)
- 版本控制 (1)
- Android 线程服务广播 (1)
- SRTP (2)
- 单片机及ARM等 (3)
- 基础知识 (5)
- asp.net (2)
- 单片机 (1)
- 设计模式及架构 (1)
- 安全 (1)
- Cubieboard 草莓树莓各类派 Android开发板 (1)
- J2EE (2)
- BootStrap (3)
- BootStrap web前端开发 (1)
- web前端开发 (4)
- object-c (1)
- openwrt (8)
- 智能家居 (4)
- Node.js (4)
最新评论
-
xiaoxiecomeon:
你这个程序一存在线程的时间片相互抢占的问题,运行时间长了很可能 ...
Runnable 和 Thread -
dotjar:
我觉得话应该这么说:引用TestThread tt = new ...
Runnable 和 Thread -
dagf113225:
调用TelephonyManager的隐藏API是先参考Fra ...
Android提高第十四篇之探秘TelephonyManager
Visual C# HTTP协议开发
- HTTP协议简介
- 与HTTP相关类的简介
HTTP协议简介
HTTP协议简介
在TCP/IP体系结构中,HTTP属于应用层协议,位于TCP/IP协议的顶层。浏览Web时,浏览器通过HTTP协议与Web服务器交换信息。这些信息(文档)类型的格式由MIME定义。
HTTP协议具有以下的特点:
- HTTP按客户/服务器模式工作
HTTP支持客户(一般情况是浏览器)与服务器的通讯,相互传输数据。
HTTP定义的事务处理由以下四步组成:- 客户与服务器建立连接;
- 客户向服务器提出请求;
- 如果请求被接受,则服务器送回响应,在响应中包括状态码和所需的文件;
- 客户与服务器断开连接
一次HTTP操作称为一次事务(transaction)。 - HTTP是无状态的
也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。 - HTTP使用元信息作为头标
HTTP对所有事务都加了头标(header)。也就是说,在主要数据前加上一块信息,称为元信息(metainformation)。它使服务器能够提供正在传送数据的有关信息。例如,传送对象是哪种类型,是用哪种语言书写的等。
从功能上讲,HTTP支持四类元信息:一般信息头标、请求头标、响应头标和实体头标。 - HTTP支持两种请求和响应格式
HTTP由不同的两部分组成,一是从浏览器发往服务器的请求,二是服务器对客户的响应。
HTTP支持两种请求和响应,即简单请求与完全请求和简单响应与完全响应。 - HTTP是基于文本的简单协议
HTTP的请求
HTTP的常用请求方法:
方 法 | 说 明 |
GET | 请求读取一个Web页面 |
HEAD | 请求读取一个Web页面的头标 |
PUT | 请求存储一个Web页面 |
POST | 附加到命名资源中 |
DELETE | 删除Web页面 |
LINK | 连接两个已有资源 |
UNLINK | 取消两个资源之间的已有连接 |
HTTP请求的格式如下所示:




在HTTP请求中,第一行必须是一个请求行(request line),用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息。在首部之后是一个空行,再此之后可以添加任意的其他数据[称之为主体(body)]。
在HTTP中,定义了大量的请求类型,不过Ajax开发人员关心的只有GET请求和POST请求。只要在Web浏览器上输入一个URL,浏览器就将基于该URL向服务器发送一个GET请求,以告诉服务器获取并返回什么资源。对于www.wzu.edu.cn的GET请求如下所示:





请求行的第一部分说明了该请求是GET请求。该行的第二部分是一个斜杠(/),用来说明请求的是该域名的根目录。该行的最后一部分说明使用的是HTTP 1.1版本(另一个可选项是1.0)。那么请求发到哪里去呢?这就是第二行的内容。
第2行是请求的第一个首部,HOST。首部HOST将指出请求的目的地。结合HOST和上一行中的斜杠(/),可以通知服务器请求的是www.wzu.edu.cn/(HTTP 1.1才需要使用首部HOST,而原来的1.0版本则不需要使用)。第三行中包含的是首部User-Agent,服务器端和客户端脚本都能够访问它,它是浏览器类型检测逻辑的重要基础。该信息由你使用的浏览器来定义(在本例中是Firefox 1.0.1),并且在每个请求中将自动发送。最后一行是首部Connection,通常将浏览器操作设置为Keep-Alive(当然也可以设置为其他值,但这已经超出了本书讨论的范围)。注意,在最后一个首部之后有一个空行。即使不存在请求主体,这个空行也是必需的。
如果要获取一个诸如http://www.wzu.edu.cn/books的www.wzu.edu.cn域内的页面,那么该请求可能类似于:





注意只有第一行的内容发生了变化,它只包含URL中www.wzu.edu.cn后面的部分。
要发送GET请求的参数,则必须将这些额外的信息附在URL本身的后面。其格式类似于:
该信息称之为查询字符串(query string),它将会复制在HTTP请求的请求行中,如下所示:





另一方面,POST请求在请求主体中为服务器提供了一些附加的信息。通常,当填写一个在线表单并提交它时,这些填入的数据将以POST请求的方式发送给服务器。
以下就是一个典型的POST请求:








从上面可以发现, POST请求和GET请求之间有一些区别。首先,请求行开始处的GET改为了POST,以表示不同的请求类型。你会发现首部Host和User-Agent仍然存在,在后面有两个新行。其中首部Content-Type说明了请求主体的内容是如何编码的。浏览器始终以application/ x-www-form- urlencoded的格式编码来传送数据,这是针对简单URL编码的MIME类型。首部Content-Length说明了请求主体的字节数。在首部Connection后是一个空行,再后面就是请求主体。与大多数浏览器的POST请求一样,这是以简单的“名称—值”对的形式给出的,其中name是Professional Ajax,publisher是Wiley。你可以以同样的格式来组织URL的查询字符串参数。
正如前面所提到的,还有其他的HTTP请求类型,它们遵从的基本格式与GET请求和POST请求相同。下一步我们来看看服务器将对HTTP请求发送什么响应。
HTTP响应
如下所示,HTTP响应的格式与请求的格式十分类似:




正如你所见,在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。以下就是一个HTTP响应的例子:














在本例中,状态行给出的HTTP状态代码是200,以及消息OK。状态行始终包含的是状态码和相应的简短消息,以避免混乱。最常用的状态码有:
- 200 (OK): 找到了该资源,并且一切正常。
- 304 (NOT MODIFIED): 该资源在上次请求之后没有任何修改。这通常用于浏览器的缓存机制。
- 401 (UNAUTHORIZED):客户端无权访问该资源。这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器。
- 403 (FORBIDDEN):客户端未能获得授权。这通常是在401之后输入了不正确的用户名或密码。
- 404 (NOT FOUND):在指定的位置不存在所申请的资源。
在状态行之后是一些首部。通常,服务器会返回一个名为Date的首部,用来说明响应生成的日期和时间(服务器通常还会返回一些关于其自身的信息,尽管并非是必需的)。接下来的两个首部大家应该熟悉,就是与POST请求中一样的Content-Type和Content-Length。在本例中,首部Content-Type指定了MIME类型HTML(text/html),其编码类型是ISO-8859-1(这是针对美国英语资源的编码标准)。响应主体所包含的就是所请求资源的HTML源文件(尽管还可能包含纯文本或其他资源类型的二进制数据)。浏览器将把这些数据显示给用户。
注意,这里并没有指明针对该响应的请求类型,不过这对于服务器并不重要。客户端知道每种类型的请求将返回什么类型的数据,并决定如何使用这些数据。
与HTTP相关类的简介
WebRequest类
WebRequest 是 .NET Framework 的用于访问 Internet 数据的请求/响应模型的抽象基类。使用该请求/响应模型的应用程序可以用协议不可知的方式从 Internet 请求数据。在这种方式下,应用程序处理 WebRequest 类的实例,而协议特定的子类则执行请求的具体细节。
请求从应用程序发送到某个特定的 URI,如服务器上的 Web 页。URI 从一个为应用程序注册的 WebRequest 子代列表中确定要创建的适当子类。注册 WebRequest 子代通常是为了处理某个特定的协议(如 HTTP 或 FTP),但是也可以注册它以处理对特定服务器或服务器上的路径的请求。
由于 WebRequest 类是一个抽象类,所以 WebRequest 实例在运行时的实际行为由 WebRequest.Create 方法所返回的子类确定。
注意 使用 Create 方法初始化新的 WebRequest 实例。不要使用 WebRequest 构造函数。
下面的示例说明如何创建 WebRequest 实例并返回响应。







WebResponse类
WebResponse 类是抽象(在 Visual Basic 中为 MustInherit)基类,协议特定的响应类从该抽象基类派生。应用程序可以使用WebResponse 类的实例以协议不可知的方式参与请求和响应事务,而从 WebResponse 派生的协议特定的类携带请求的详细信息。
客户端应用程序不直接创建 WebResponse 对象,而是通过调用 WebRequest 实例上的 GetResponse 方法来创建它。
下面的示例从 WebRequest 创建 WebResponse 实例。







HttpWebRequest类
HttpWebRequest 类对 WebRequest 中定义的属性和方法提供支持,也对使用户能够直接与使用 HTTP 的服务器交互的附加属性和方法提供支持。
不要使用 HttpWebRequest 构造函数。使用 WebRequest.Create 方法初始化 HttpWebRequest 的一个新实例。如果 URI 的方案是 http://
或 https://
,则 Create 将返回 HttpWebRequest 实例。
GetResponse 方法向 RequestUri 属性中指定的 Internet 资源发出同步请求并返回包含该响应的 HttpWebResponse 实例。可以使用 BeginGetResponse 和 EndGetResponse 方法对 Internet 资源发出异步请求。
当要向 Internet 资源发送数据时,GetRequestStream 方法返回用于发送数据的Stream实例。BeginGetRequestStream 和EndGetRequestStream 方法提供对发送数据流的异步访问。
下面的示例为 URI http://www.contoso.com/ 创建 HttpWebRequest。
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create("http://www.contoso.com/");
HttpWebResponse类
此类包含对 WebResponse 类中的属性和方法的 HTTP 特定用法的支持。HttpWebResponse 类用于生成发送 HTTP 请求和接收 HTTP 响应的 HTTP 独立客户端应用程序。
注意:不要混淆 HttpWebResponse 和 HttpResponse;后者用于 ASP.NET 应用程序,而且它的方法和属性是通过 ASP.NET 的内部 HttpResponse 对象公开的。
决不要直接创建 HttpWebResponse 类的实例。而应当使用通过调用 HttpWebRequest.GetResponse 所返回的实例。
从 Internet 资源返回的公共标头信息公开为该类的属性。有关完整的列表,请参见下表。可以从 Headers 属性以名称/值对的形式读取其他标头。
下表显示可以通过 HttpWebResponse 类的属性使用的公共 HTTP 标头。
Content-Encoding
|
ContentEncoding
|
Content-Length
|
ContentLength
|
Content-Type
|
ContentType
|
Last-Modified
|
LastModified
|
服务器
|
Server
|
通过调用 GetResponseStream 方法,以 Stream 的形式返回来自 Internet 资源的响应的内容。
下面的示例返回 HttpWebRequest 的 HttpWebResponse:
HttpWebRequest HttpWReq = (HttpWebRequest)WebRequest.Create("http://www.contoso.com");
HttpWebResponse HttpWResp = (HttpWebResponse)HttpWReq.GetResponse();
// Insert code that uses the response object.
HttpWResp.Close()
Uri类
URI 是 Internet 上可由应用程序使用的资源的简洁表示形式。Uri 类定义了属性和方法来处理 URI,包括分析、比较和组合。Uri 类属性是只读的,修改 Uri 实例需使用 UriBuilder 类。
Uri 类只存储绝对 URI(例如“http://www.contoso.com/index.htm”)。相对 URI(例如“/new/index.htm”)必须相对于基 URI 展开,这样才是绝对的。提供了 MakeRelative 方法在必要时将绝对 URI 转换为相对 URI。
URI 由转义编码存储为规范化 URI,所有 ASCII 值大于 127 的字符都被替换为它们的等效十六进制数。为使 URI 具有规范化格式,Uri 构造函数执行以下步骤。
- 将 URI 方案转换为小写。
- 将主机名转换为小写。
- 移除默认端口号和空端口号。
- 移除多余的段(如“/”和“/test”段)以简化 URI。
使用 ToString 方法,可以将 Uri 类的内容从转义编码的 URI 引用转换为可读的 URI 引用。
一些 URI 包括段标识符或查询。段标识符是 URI 中跟在数字符号 (#) 后的任何文本,存储在 Fragment 属性中。查询信息是 URI 中跟在问号 (?) 后的任何文本,存储在 Query 属性中。
注意:URI 类支持使用以下格式的 IP 地址:四组表示法的 IPv4 协议和冒号分隔的十六进制 IPv6 协议。请记住在 IPv6 地址两边括上方括号,如 http://[::1]。
下面的示例创建 Uri 类的实例,并用它来创建 WebRequest。


发表评论
-
C# 全局异常处理
2015-10-20 13:36 1127咳,今天给大家带来一个关于C#中的异常处理,很多朋友在C#中 ... -
C#如何判断操作系统位数是32位还是64位
2014-11-07 10:50 1425方法一:对于C#来说,调用WMI是一种简单易行的方式。我们 ... -
UML类图几种关系的总结
2014-11-03 09:34 519在UML类图中,常见的有以下几种关系: 泛化(Genera ... -
Assembly类
2014-10-30 10:25 613System.Reflection.Assembly类是一个 ... -
由云台协议DLL浅谈插件程序的编写(下)
2014-10-28 13:47 450由云台协议DLL浅谈插件程序的编写(下)【原创】 1.创建 ... -
由云台协议DLL浅谈插件程序的编写(上)
2014-10-28 13:47 559前言:本文通过一个简单的工程描述了一种插件设计的思想。复杂设 ... -
平台+插件软件设计基本思想
2014-10-28 13:38 973平台+插件软件设计基 ... -
插件式设计的架构模型与实例
2014-10-28 13:38 342插件式设计近年来非常流行,其中eclipse起了推波助澜的作 ... -
C++插件架构浅谈与初步实现
2014-10-28 13:36 707一、插件架构初步介绍 ... -
什么时候用抽象类,什么时候用接口
2014-09-27 14:18 572共同点是他们都可以实现多态。 不同点在于设计抽象类和接口的目 ... -
使用 Override 和 New 关键字进行版本控制(C# 编程指南)
2014-09-24 14:10 523使用 Override 和 New 关键字进行版本控制(C# ... -
override(C# 参考)
2014-09-24 14:08 393override(C# 参考) Visual Stud ... -
接口可以实例化
2014-09-24 13:53 1033接口可以实例化 ... -
C#的WinForm中如何让窗体大小不能改变
2014-08-20 14:20 1113设置FormBorderStyle属性为FixDialog即可 ... -
HOW TO:使用 Visual C# .NET 从文件中读取 XML
2012-03-06 20:52 1231本文描述如何使用 XmlTe ... -
C#XML操作
2012-03-06 20:52 801using System.Xml; namespace ... -
c# http编程
2012-03-06 20:52 972c# http编程 2010-06-18 11:10 ...
相关推荐
网络编程是现代软件开发的重要组成部分,这一章涵盖了TCP/IP通信、HTTP协议、Socket编程等内容,让开发者具备创建网络客户端和服务器端应用的能力。 7. **第7章 C# WEB编程应用**: 针对Web开发,本章介绍了ASP...
在本教程中,我们将深入探讨如何使用Microsoft的开发工具Visual Basic .NET和Visual C#.NET来创建和使用XML Web服务及服务器组件。 1. **XML Web服务基础** XML Web服务基于开放标准,如SOAP(简单对象访问协议)...
《Visual C#通用范例开发金典源码》是一份极具价值的学习资源,它涵盖了C#编程语言在实际开发中的各种通用范例。C#,全称C Sharp,是微软公司推出的面向对象的编程语言,它以其强大的功能、高效的性能和良好的.NET...
全书共分13章,主要内容包括网络编程原理、Visual C# 2005的套接字以及多线程的开发、基于各种不同协议的网络编程应用模块,并通过几个典型的实例介绍了Visual C# 2005网络编程的实际应用。 本书注重代码的通用性和...
- **Visual Studio (VS)**:微软提供的集成开发环境,用于编写、调试和发布C#应用程序,包括Web API项目。 - **IIS(Internet Information Services)**:Windows操作系统上的Web服务器,可以用来部署和运行ASP...
《Visual C#.NET中文版Web服务开发基础》这本书是一本针对.NET Web开发初学者和进阶者的必备参考资料。它深入浅出地介绍了使用C#语言进行Web服务开发的关键技术和实践方法,旨在帮助读者掌握.NET框架下的Web服务开发...
本文将详细探讨C# .NET在工控上位机开发中的应用,以及相关的核心知识点。 一、C#语言基础 C#是一种面向对象的编程语言,由微软公司开发,主要用于.NET Framework平台。它的语法简洁明了,支持类型安全和垃圾回收,...
《Visual C#.NET中文版Web服务开发基础》是针对初学者和有一定编程基础的开发者的一份宝贵资源,它深入浅出地介绍了如何使用C#语言和.NET框架来开发Web服务。Web服务是一种基于互联网的软件应用程序,允许不同系统...
《C#入门经典》—— Beginning ...通过《C#入门经典》这本书,读者将全面了解C#语言的基本概念、语法特性和实用技巧,并学会如何在Visual Studio 2008环境下进行程序开发,为进一步深入学习和实践打下坚实的基础。
本书旨在帮助开发者掌握使用Visual C# .NET进行网络应用开发的关键技术和实践方法,涵盖从基础的网络概念到高级的网络通信协议,以及如何在.NET Framework环境下构建高效的网络应用程序。 首先,我们需要理解C#语言...
在本文中,我们将深入探讨如何使用Visual C#进行ASP.NET开发,这是一门强大的技术,用于构建高效、可扩展的Web应用程序。Visual C#(通常缩写为C#)是微软公司开发的一种面向对象的编程语言,而ASP.NET是.NET框架的...
《Visual C# 2005开发技术》一书涵盖了C#编程语言在Visual Studio 2005环境中的核心概念和技术。C#是微软公司推出的一种面向对象的、现代的编程语言,专为.NET Framework设计,旨在提高开发效率和代码可维护性。...
总的来说,《Visual C#.NET网络核心编程》涵盖了C#.NET中用于网络开发的关键技术和实践,帮助开发者掌握构建高效、可靠网络应用的技能。通过学习和实践书中的内容,开发者将能够利用C#.NET的强大功能,设计和实现...
在本文档中,我们探讨了使用Visual C#.Net进行网络程序开发,特别是在Socket编程方面。Microsoft.Net Framework提供了强大的工具,让开发者能够轻松地创建各种网络应用程序。系统命名空间System.Net和System.Net....
10. **网络编程**:介绍C#中的Socket编程,以及HTTP、FTP等网络协议的实现,为开发者提供网络通信的基础。 11. **.NET Framework库**:探讨.NET Framework提供的大量类库,如System.IO、System.Net、System.Drawing...
【Visual C#.Net 网络程序开发-Tcp篇(1)】 在.NET框架中,Visual C#提供了丰富的网络编程接口,使得开发者可以方便地构建基于TCP协议的应用程序。TcpClient类是.NET Framework中用于客户端通信的一个关键组件,它...
通过上述分析,《Visual C#.NET网络编程》系列文章为读者提供了从理论到实践的全面指导,涵盖了网络编程的基础概念、开发模式、示例代码等方面。虽然这些内容相对基础,但对于初学者来说是非常有价值的资源。对于想...