.NET Request、Response开发总结
首先看下Web Request类Web Response类层次结构,如下图1.1 所示,其中有工厂模式的运用。
再看下 MSDN上各个类的说明
WebRequest 类
1 . 发出对统一资源标识符 (URI) 的请求。这是一个 abstract 类。
[SerializableAttribute]
public abstract class WebRequest : MarshalByRefObject, ISerializable
2. WebRequest 是 .NET Framework 的请求/响应模型的 abstract 基类,用于访问 Internet 数据。使用该请求/响应模型的应用程序可以用协议不可知的方式从 Internet 请求数据,在这种方式下,应用程序处理 WebRequest 类的实例,而协议特定的子类则执行请求的具体细节。
请求从应用程序发送到某个特定的 URI,如服务器上的网页。URI 从一个为应用程序注册的 WebRequest 子代列表中确定要创建的适当子类。注册 WebRequest 子代通常是为了处理某个特定的协议(如 HTTP 或 FTP),但是也可以注册它以处理对特定服务器或服务器上的路径的请求。
如果在访问 Internet 资源时发生错误,则 WebRequest 类将引发 WebException。WebException.Status 属性是 WebExceptionStatus 值之一,它指示错误源。当 WebException.Status 为 WebExceptionStatus.ProtocolError 时,Response 属性包含从 Internet 资源接收的 WebResponse。
因为 WebRequest 类是一个 abstract 类,所以 WebRequest 实例在运行时的实际行为由 System.Net.WebRequest.Create 方法所返回的子类确定。有关默认值和异常的更多信息,请参见有关子类的文档,如 HttpWebRequest 和 FileWebRequest。
注意
使用 Create 方法初始化新的 WebRequest 实例。不要使用 WebRequest 构造函数。
下面的示例说明如何创建 WebRequest 实例并返回响应。
代码
using
System;
using
System.IO;
using
System.Net;
using
System.Text;
namespace
Examples.System.Net
{
public
class
WebRequestGetExample
{
public
static
void
Main ()
{
//
Create a request for the URL.
WebRequest request
=
WebRequest.Create (
http://www.cnblogs.com/zycblog/
);
//
If required by the server, set the credentials.
request.Credentials
=
CredentialCache.DefaultCredentials;
//
Get the response.
HttpWebResponse response
=
(HttpWebResponse)request.GetResponse ();
//
Display the status.
Console.WriteLine (response.StatusDescription);
//
Get the stream containing content returned by the server.
Stream dataStream
=
response.GetResponseStream ();
//
Open the stream using a StreamReader for easy access.
StreamReader reader
=
new
StreamReader (dataStream);
//
Read the content.
string
responseFromServer
=
reader.ReadToEnd ();
//
Display the content.
Console.WriteLine (responseFromServer);
//
Cleanup the streams and the response.
reader.Close ();
dataStream.Close ();
response.Close ();
}
}
}
HttpWebRequest 类
1. 提供 WebRequest 类的 HTTP 特定的实现。
[SerializableAttribute]
public class HttpWebRequest : WebRequest, ISerializable
2. HttpWebRequest 类对 WebRequest 中定义的属性和方法提供支持,也对使用户能够直接与使用 HTTP 的服务器交互的附加属性和方法提供支持。
不要使用 HttpWebRequest 构造函数。使用 System.Net.WebRequest.Create 方法初始化新的 HttpWebRequest 对象。如果统一资源标识符 (URI) 的方案是 http:// 或 https://,则 Create 返回 HttpWebRequest 对象。
GetResponse 方法向 RequestUri 属性中指定的资源发出同步请��并返回包含该响应的 HttpWebResponse。可以使用 BeginGetResponse 和 EndGetResponse 方法对资源发出异步请求。
当要向资源发送数据时,GetRequestStream 方法返回用于发送数据的 Stream 对象。BeginGetRequestStream 和 EndGetRequestStream 方法提供对发送数据流的异步访问。
对于使用 HttpWebRequest 的客户端验证身份,客户端证书必须安装在当前用户的“我的证书”存储区中。
如果在访问资源时发生错误,则 HttpWebRequest 类将引发 WebException。WebException.Status 属性包含指示错误源的 WebExceptionStatus 值。当 WebException.Status 为 WebExceptionStatus.ProtocolError 时,Response 属性包含从资源接收的 HttpWebResponse。
HttpWebRequest 将发送到 Internet 资源的公共 HTTP 标头值公开为属性,由方法或系统设置;下表包含完整列表。可以将 Headers 属性中的其他标头设置为名称/值对。注意,服务器和缓存在请求期间可能会更改或添加标头。
面的代码示例为 URI http://www.contoso.com/. 创建 HttpWebRequest。
HttpWebResponse 类
1. 提供 WebResponse 类的 HTTP 特定的实现
2. 此类包含对 WebResponse 类中的属性和方法的 HTTP 特定用法的支持。 HttpWebResponse 类用于生成发送 HTTP 请求和接收 HTTP 响应的 HTTP 独立客户端应用程序。
说明
不要混淆 HttpWebResponse 和 HttpResponse 类;后者用于 ASP.NET 应用程序,而且它的方法和属性是通过 ASP.NET 的内部 Response 对象公开的。
决不要直接创建 HttpWebResponse 类的实例。 而应当使用通过调用 HttpWebRequest.GetResponse 所返回的实例。 您必须调用 Stream.Close 方法或 HttpWebResponse.Close 方法来关闭响应并将连接释放出来供重用。 不必同时调用 Stream.Close 和 HttpWebResponse.Close,但这样做不会导致错误。
下面的示例返回 HttpWebRequest 的 HttpWebResponse
代码
HttpWebRequest HttpWReq
=
(HttpWebRequest)WebRequest.Create(
http://www.cnblogs.com/zycblog/
);
HttpWebResponse HttpWResp
=
(HttpWebResponse)HttpWReq.GetResponse();
//
Insert code that uses the response object.
HttpWResp.Close();
HttpRequest 类
使 ASP.NET 能够读取客户端在 Web 请求期间发送的 HTTP 值。
public sealed class HttpRequest
HttpRequest 类的方法和属性通过 HttpApplication、HttpContext、Page 和 UserControl 类的 Request 属性公开。
下面的代码示例使用 StreamWriter 类将若干 HttpRequest 类属性值的值写入文件。对于是字符串类型的属性,属性值被写入文件时将被编码为 HTML。表示集合的属性会被依次通过,而这些属性包含的各个键/值对都会被写入该文件。
代码
<%
@ Page Language
=
"
C#
"
%>
<%
@ import Namespace
=
"
System.Threading
"
%>
<%
@ import Namespace
=
"
System.IO
"
%>
<
script runat
=
"
server
"
>
/*
NOTE: To use this sample, create a c:\temp\CS folder,
* add the ASP.NET account (in IIS 5.x <machinename>\ASPNET,
* in IIS 6.x NETWORK SERVICE), and give it write permissions
* to the folder.
*/
private
const
string
INFO_DIR
=
@"
c:\temp\CS\RequestDetails
"
;
public
static
int
requestCount;
private
void
Page_Load(
object
sender, System.EventArgs e)
{
//
Create a variable to use when iterating
//
through the UserLanguages property.
int
langCount;
int
requestNumber
=
Interlocked.Increment(
ref
requestCount);
//
Create the file to contain information about the request.
string
strFilePath
=
INFO_DIR
+
requestNumber.ToString()
+
@"
.txt
"
;
StreamWriter sw
=
File.CreateText(strFilePath);
try
{
//
Write request information to the file with HTML encoding.
sw.WriteLine(Server.HtmlEncode(DateTime.Now.ToString()));
sw.WriteLine(Server.HtmlEncode(Request.CurrentExecutionFilePath));
sw.WriteLine(Server.HtmlEncode(Request.ApplicationPath));
sw.WriteLine(Server.HtmlEncode(Request.FilePath));
sw.WriteLine(Server.HtmlEncode(Request.Path));
//
Iterate through the Form collection and write
//
the values to the file with HTML encoding.
//
String[] formArray = Request.Form.AllKeys;
foreach
(
string
s
in
Request.Form)
{
sw.WriteLine(
"
Form:
"
+
Server.HtmlEncode(s));
}
//
Write the PathInfo property value
//
or a string if it is empty.
if
(Request.PathInfo
==
String.Empty)
{
sw.WriteLine(
"
The PathInfo property contains no information.
"
);
}
else
{
sw.WriteLine(Server.HtmlEncode(Request.PathInfo));
}
//
Write request information to the file with HTML encoding.
sw.WriteLine(Server.HtmlEncode(Request.PhysicalApplicationPath));
sw.WriteLine(Server.HtmlEncode(Request.PhysicalPath));
sw.WriteLine(Server.HtmlEncode(Request.RawUrl));
//
Write a message to the file dependent upon
//
the value of the TotalBytes property.
if
(Request.TotalBytes
>
1000
)
{
sw.WriteLine(
"
The request is 1KB or greater
"
);
}
else
{
sw.WriteLine(
"
The request is less than 1KB
"
);
}
//
Write request information to the file with HTML encoding.
sw.WriteLine(Server.HtmlEncode(Request.RequestType));
sw.WriteLine(Server.HtmlEncode(Request.UserHostAddress));
sw.WriteLine(Server.HtmlEncode(Request.UserHostName));
sw.WriteLine(Server.HtmlEncode(Request.HttpMethod));
//
Iterate through the UserLanguages collection and
//
write its HTML encoded values to the file.
for
(langCount
=
0
; langCount
<
Request.UserLanguages.Length; langCount
++
)
{
sw.WriteLine(
@"
User Language
"
+
langCount
+
"
:
"
+
Server.HtmlEncode
(Request.UserLanguages[langCount]));
}
}
finally
{
//
Close the stream to the file.
sw.Close();
}
lblInfoSent.Text
=
"
Information about this request has been sent to a file.
"
;
}
private
void
btnSendInfo_Click(
object
sender, System.EventArgs e)
{
lblInfoSent.Text
=
"
Hello,
"
+
Server.HtmlEncode(txtBoxName.Text)
+
"
. You have created a new request info file.
"
;
}
</
script
>
<
html
>
<
head
>
</
head
>
<
body
>
<
form runat
=
"
server
"
>
<
p
>
</
p
>
<
p
>
Enter your hame here:
<
asp:TextBox id
=
"
txtBoxName
"
runat
=
"
server
"
></
asp:TextBox
>
</
p
>
<
p
>
<
asp:Button id
=
"
btnSendInfo
"
onclick
=
"
btnSendInfo_Click
"
runat
=
"
server
"
Text
=
"
Click Here
"
></
asp:Button
>
</
p
>
<
p
>
<
asp:Label id
=
"
lblInfoSent
"
runat
=
"
server
"
></
asp:Label
>
</
p
>
</
form
>
</
body
>
</
html
>
有关HTTP POST,GET的区别可以参考博客文章
http://www.cnblogs.com/liuhaitao/archive/2008/10/29/1321896.html
下面贴出一段Http post的客户端,服务端代码示例
客户端http Post
代码
HttpWebRequest req
=
(HttpWebRequest)HttpWebRequest.Create(OraTransGetTest);
req.Method
=
"
POST
"
;
req.ContentType
=
"
application/x-www-form-urlencoded;charset=GBK
"
;
req.ContentLength
=
postBytes.Length;
Stream webStream
=
req.GetRequestStream();
//
发送数据
webStream.Write(postBytes,
0
, postBytes.Length);
webStream.Close();
//
获取返回数据
HttpWebResponse webResponse
=
(HttpWebResponse)req.GetResponse();
StreamReader reader
=
new
StreamReader(webResponse.GetResponseStream(), Encoding.GetEncoding(
"
GBK
"
));
sResult
=
reader.ReadToEnd();
sResult.Trim();
服管器端针对客户的Post 需要返回客户端有用的信息
示例程序如下
代码
protected
void
Page_Load(
object
sender, EventArgs e)
{
PageLoad();
}
private
void
PageLoad()
{
GetParamLog.Info(
"
实时回写开始=======================================
"
);
string
ResponseResult
=
Response();
GetParamLog.Info(ResponseResult);
HttpResponse hr
=
HttpContext.Current.Response;
hr.Clear();
hr.Write(ResponseResult);
//
hr.Flush();
hr.End();
}
private
string
Response()
{
string
ResponseResult
=
""
;
try
{
ResponseResult
=
GetPostInput();
GetParamLog.InfoFormat(
"
请求参数内容:{0}
"
, ResponseResult);
GetParamLog.Info(
"
开始解析请求参数
"
);
string
[] ResposeArray
=
ResponseResult.Split(
'
&
'
);
if
(ResposeArray.Length
>
0
)
{
foreach
(
string
param
in
ResposeArray)
{
//
程序处理逻辑 给ResponseResult赋值,然后返回客户端
}
}
}
catch
(Exception ex)
{
GetParamLog.Error(ex.Message);
throw
;
}
return
ResponseResult;
}
private
string
GetParam(
string
[] ParamArray,
string
ParamName)
{
if
(ParamArray.Length
<=
0
)
{
return
""
;
}
foreach
(
string
name
in
ParamArray)
{
if
(name.Split(
'
=
'
)[
0
].ToLower()
==
ParamName.ToLower())
{
return
name.Split(
'
=
'
)[
1
].ToString();
}
}
return
""
;
}
private
string
GetPostInput()
{
try
{
System.IO.Stream s
=
Request.InputStream;
int
count
=
0
;
byte
[] buffer
=
new
byte
[
1024
];
StringBuilder builder
=
new
StringBuilder();
while
((count
=
s.Read(buffer,
0
,
1024
))
>
0
)
{
builder.Append(Encoding.UTF8.GetString(buffer,
0
, count));
}
return
builder.ToString();
}
catch
(Exception ex)
{
throw
ex;
}
}
其中 HttpResponse hr = HttpContext.Current.Response;
hr.Clear();
hr.Write(ResponseResult);
//hr.Flush();
hr.End();
是把客户端需要的结果返回回去