HTTP 处理程序和 HTTP 模块概述——附记

IHttpHandler IsReusable Property
There isn't much clear info regarding this property on the net. It can be better in terms of performance when the property is set to true, but can cause some headaches if you have set it to true in the wrong scenario.

public bool IsReusable
{
   get
   {
      return false;
   }
}
The property is used to indicate if a single intantiation of your IHttpHandler implementation can be used to process multiple concurrent requests. Each client request is considered to be a worker thread on the serverside when being processed through the ASP.NET pipeline. So, if we set IsReusable = true, we need to make sure that our ProcessRequest method is threadsafe. The ProcessRequest should not rely on any state that could be modified by other concurrent request threads. Important when your IHttpHandler implementation does expensive initialisations, otherwise it probabaly doesn't really matter if you return true or false (since simple object allocation is fairly inexpensive in .NET). N.B. Pages are never pooled.

IHttpHandler接口中的属性 IsReusable

在MSDN上对IsReusable的介绍不够清楚。当该属性设置为true,将获得更好的执行性能,但是这在某些情况会引起一些 headcache的问题。
public bool IsReusable
{
 get { return false; }
}
这 个属性用来指明,如果你IHttpHandler的实现类的单个实例被用来处理多个请求。当通过ASP.NET 管道处理时,每个客户端请求被服务端认为是一个工作者线程。因此,如果我们设置 IsReusable = true 时,我们需要确信ProcessRequest 方法是线程安全的。 ProcessRequest 应该不会依赖任何有可能被其他请求修改的状态值。当你的IHttpHandler 实现类忙于做初始化时,否则你无需介意IsReusable 返回的是true 或者 false。




get和post方法的不同(文章发表时间较长,但值得参考)
在 B/S应用程序中,前台与后台的数据交互,都是通过HTML中Form表单完成的。Form提供了两种数据传输的方式——get和post。虽然它们都是 数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的影响。虽然为了方便的得到变量值,Web容器已经屏蔽了二者的一些差异,但 是了解二者的差异在以后的编程也会很有帮助的。
  Form中的get和post方法,在数据传输过程中分别对应了HTTP协议中的GET和POST方法。二者主要区别如下:
  1、Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据。
  2、Get将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用 “&”连接;Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL。
  3、Get是不安全的,因为在传输过程,数据被放在请求的URL中,而如今现有的很多服务器、代理服务器或者用户代理都会将请求URL记录到日志文件中, 然后放在某个地方,这样就可能会有一些隐私的信息被第三方看到。另外,用户也可以在浏览器上直接看到提交的数据,一些系统内部消息将会一同显示在用户面 前。Post的所有操作对用户来说都是不可见的。
  4、Get传输的数据量小,这主要是因为受URL长度限制;而Post可以传输大量的数据,所以在上传文件只能使用Post(当然还有一个原因,将在后面的提到)。
  5、Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。
  6、Get是Form的默认方法。
 

ASP与Form一起工作

上次我们说ASP的目的是让页面与用户交互,那么,怎样得到用户的信息呢?当然是用 Form,不论是CGI,IDC,JAVA,还是其他的什么技术,都是通过嵌在WWW页面中的Form来让浏览器的用户输入信息,然后,Form的提交动 作,把数据传给了服务器,服务器再把数据传给CGI或是其他的什么程序.既然Form如此重要,那么这次就让我们来看一看在ASP中,怎样子获得用户在 Form中输入的数据,同时,我们还将学到ASP是怎样将结果返回到WWW页面的.

首先,我们建立一个Form,他的HTML代码如下:

 

<HTML>

<HEAD><TITLE>定单</TITLE></HEAD>

<BODY>

<H2>定单Form例子</H2>

<P>

请向我们提供以下信息,然后单击"提交":

<FORM METHOD="POST" ACTION="response.asp">

<P>

姓: <INPUT NAME="fname" SIZE="48">

<P>

名: <INPUT NAME="lname" SIZE="48">

<P>

称呼: <INPUT NAME="title" TYPE=RADIO VALUE="先生">先生

<INPUT NAME="title" TYPE=RADIO VALUE="女士">女士

<P><INPUT TYPE=SUBMIT VALUE="提交"><INPUT TYPE=RESET VALUE="清除">

</FORM>

</BODY>

</HTML>

这个表单是一个简单的定单例子,它接收客户的姓名,称呼,然后用POST方法将数据提交.我 们知道,表单(Form)提交数据常有两种方法,一种是GET,一种是POST,对于GET提交的数据,WWW服务器将把数据放在环境变量 QUERY_STRING中,对于POST方法,数据被送到WWW服务器的STDOUT中,然后CGI从自己的STDIN中读取.传统的CGI方法必须自 己处理这些数据.可是在ASP中,采用了面向对象的思想,所有从浏览器来的数据都被封装进了对象Request中.Request有方法Form和 Querystring,分别返回用POST方法和GET方法提交的数据.我们要得到表单提交的数据,只需用

Request.Form("表单域名") 或

Request.Querystring("查询参数名")

就可以了.

好了,接下来就让我们建立.asp文件Response.asp来处理上面的表单提交的数据吧,这里,我们只是简单的将用户提交的数据返回给用户.

<HTML>

<HEAD></HEAD>

<BODY>

<%

Title = Request.Form("title")

LastName = Request.Form("lname")

If Title = "先生" Then

%>

 

<%= LastName %>先生

<% ElseIf Title = "女士" Then %>

<%= LastName %>女士

<% Else %>

<%= Request.Form("fname") & " " & LastName %>

<% End If %>

</BODY>

</HTML>

恩,上面这段代码有些难懂吧,不要怕,一会儿之后,你就会说,好简单啊.那,我们来分析一下它吧.首先,他的开头和结尾都和普通的HTML代码没有什么两样,关键是中间.如果略去定界符<%和%>,然后将前面没有东西的等号换成 Print ,它就变成了:

Title=Request.Form("title")

LastName=Request.Form("lname")

If Title="先生" Then

print LastName 先生

ElseIf Title="女士" Then

print LastName 女士

Else

print Request.Form("fname")&" "& LastName

End If

这是不是VB?很简单吧?

有一点说明的是,.asp文件中,不在定界符之内的字符,当成普通的HTML解释.如上面 的"先生","女士".ASP自己的输出用一个等号加上对象名来实现(当然,ASP的代码在定界符之内).如上面的<%=LastName%& gt;.其实,在.asp文件中,任何对象要作用到定界符之外就要用这种形式:<%=对象名%>.

至于IF..THEN判断分支,就不用我解释了吧:)

上面我们用<%=对象名%>来实现ASP向页面的数据输出,使得.asp文件看起来比较接近HTML文件,下面我们用另一种方法来实现:

 

<HTML>

<HEAD></HEAD>

<BODY>

<%

Title = Request.Form("title")

LastName = Request.Form("lname")

If Title = "先生" Then

Response.Write LastName & "先生"

ElseIf Title = "女士" Then

Response.Write LastName & "女士"

Else

Response.Write Request.Form("fname") & " " & LastName

End If %>

</BODY>

</HTML>

除了开头和结尾,这看起来是不是更像一个VB程序?对了,我们用了另一个ASP内置对象Response的Write方法来输出数据.

到底用哪一种方法,那要看你的喜欢了,不过,要是有许多格式控制指令,都当成串用Write来输出,确实很麻烦的.我偏爱第一种方法:)

上面我们学了用ASP处理用POST方法提交的数据,那么,对于用GET方法提交的数据,又怎样处理呢?其实,处理都是一样的,只不过取得表单数据的方法不同罢了,比如我们要取得"title"的值,就用:

Request.Querystring("title")

对于如下方法调用.asp文件,也要用这种方法处理:

<a href="response.asp?title=先生&fname=张&lname=三">xxxxx</a>

(其实,表单的GET方法最后也被转换成了这种形式.)

大家一定要注意,用什么方法调用的.asp文件,就应当用相应的方法接收查询数据,不然,你老是被报告查询参数为空,我就遇到过许多次

 

Get请求有如下特性:它会将数据添加到URL中,通过这种方式传递到服务器,通常利用一个问号?代表URL地址的结尾与数据参数的开端,后面的参数每一个数据参数以“名称=值”的形式出现,参数与参数之间利用一个连接符&来区分。
Post请求有如下特性:数据是放在HTTP主体中的,其组织方式不只一种,有&连接方式,也有分割符方式,可隐藏参数,传递大批数据,比较方便。

 

1.使用 Get 的时候,参数会显示在地址栏上,而 Post (数据包)不会。

2Get方式的提交你需要用Request.QueryString来取得变量的值,而Post方式提交时,你必须通过Request.Form来访问提交的内容。

3.查询一般用get其他用post

 

今天晚上网页设计课,要讲到表单form的知识,有一个难点就是:从一个页面转向另一个页面的两种请求方式Post和Get的区别。
如果从原理上来探究他们的区别,涉及到Http传输协议的细节,这样深究下去,就成思科或华为人干的事了,我们不需要去研究那些东西,所以就看一下有哪些具体的区别吧。
1.Post传输数据时,不需要在URL中显示出来,而Get方法要在URL中显示。
2.Post传输的数据量大,可以达到2M,而Get方法由于受到URL长度的限制,只能传递大约1024字节.
3.Post顾名思义,就是为了将数据传送到服务器段,Get就是为了从服务器段取得数据.而Get之所以也能传送数据,只是用来设计告诉服务器,你到底需要什么样的数据.Post的信息作为http请求的内容,而Get是在Http头部传输的。
 
 
post和get的区别

post 地址栏不会出现一大串?bjnghfgreygt这样的东西

如果是get,就会出现了

1、 Get 方法通过 URL 请求来传递用户的数据,将表单内各字段名称与其内容,以成对的字符串连接,置于 action 属性所指程序的 url 后,如[url]http://www.mdm.com/test.asp?name=asd&password=sad[/url],数据都会 直接显示在 url 上,就像用户点击一个链接一样;Post 方法通过 HTTP post 机制,将表单内各字段名称与其内容放置在 HTML 表头(header)内一起传送给服务器端交由 action 属性能所指的程序处理,该程序会通过标准输入(stdin)方式,将表单的数据读出并加以处理


2、 Get 方式需要使用 Request.QueryString 来取得变量的值;而 Post 方式通过 Request.Form 来访问提交的内容


3、 Get 方式传输的数据量非常小,一般限制在 2 KB 左右,但是执行效率却比 Post 方法好;而 Post 方式传递的数据量相对较大,它是等待服务器来读取数据,不过也有字节限制,这是为了避免对服务器用大量数据进行恶意攻击,根据微软方面的说法,微软对用 Request.Form() 可接收的最大数据有限制,IIS 4 中为 80 KB 字节,IIS 5 中为 100 KB 字节

建议:除非你肯定你提交的数据可以一次性提交,否则请尽量用 Post 方法


4、 Get 方式提交数据,会带来安全问题,比如一个登陆页面,通过 Get 方式提交数据时,用户名和密码将出现在 URL 上,如果页面可以被缓存或者其他人可以访问客户这台机器,就可以从历史记录获得该用户的帐号和密码,所以表单提交建议使用 Post 方法;Post 方法提交的表单页面常见的问题是,该页面如果刷新的时候,会弹出一个对话框

建议:出于安全性考虑,建议最好使用 Post 提交数据
 
Post与Get的真正区别是其作用上的不同,Post是被设计用来向上放东西的(就像其名字所暗示的
那样);而Get是被设计用来从服务器取东西的,它所以也能够向服务器传送较少的数据,是以为当
你取东西时,你需要指明取什么,而我们有时候利用指明取什么的机制来向服务器放东西。
基于以上原因,Post与Get在http中传送的方式是不同的,Get的参数是在http的头部传送的,而
Post的数据则是在http请求的内容里传送的,一般来说,我们没有看到这中间的差别,那是因为编
程环境帮(如servlet)我们隐藏了其不同
GET  到本页面的话 是认为一个新的页面    因此 (页面的状态都会丢失)ViewState 都没了

而 POST 到本页 不会认为是一个新的页面 应此 ViewState 都在

这点在使用时要注意
1、 get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应
,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML 
HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

2、 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用
Request.Form获取提交的数据。两种方式的参数都可以用Request来获得。

3、get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论
上,IIS4中最大量为80KB,IIS5中为100KB。

4、get安全性非常低,post安全性较高。

5、<form method="get" action="a.asp?b=b">跟<form method="get" action="a.asp">
是一样的,也就是说,action页面后边带的参数列表会被忽视;而<form method="post" 
action="a.asp?b=b">跟<form method="post" action="a.asp">是不一样的。 
 

在Form里面,可以使用post也可以使用get。它们都是method的合法取值。

但是,post和get方法在使用上至少有两点不同:
1、Get方法通过URL请求来传递用户的输入。Post方法通过另外的形式。
2、Get方式的提交你需要用Request.QueryString来取得变量的值,而Post方

式提交时,你必须通过Request.Form来访问提交的内容。

仔细研究下面的代码。你可以运行之来感受一下:

代码
<!--两个Form只有Method属性不同-->
<FORM ACTION=“getpost.asp” METHOD=“get”>
<INPUT TYPE=“text” NAME=“Text” VALUE=“Hello World”></INPUT>
<INPUT TYPE=“submit” VALUE=“Method=Get”></INPUT>
</FORM>
<BR>
<FORM ACTION=“getpost.asp” METHOD=“post”>
<INPUT TYPE=“text” NAME=“Text” VALUE=“Hello World”></INPUT>
<INPUT TYPE=“submit” VALUE=“Method=Post”></INPUT>
</FORM>

<BR>
<BR>

<% If Request.QueryString(“Text”) <> ““ Then %>
通过get方法传递来的字符串是: “<B><%= Request.QueryString(“Text”) %></B>“<BR>
<% End If %>

<% If Request.Form(“Text”) <> ““ Then %>
通过Post方法传递来的字符串是: “<B><%= Request.Form(“Text”) %></B>“<BR>
<% End If %>

说明
把上面的代码保存为getpost.asp,然后运行,首先测试post方法,这时候,

浏览器的url并没有什么变化,返回的结果是:
通过Post方法传递来的字符串是: "Hello World"
然后测试用get方法提交,请注意,浏览器的url变成了:
http://localhost/general/form/getpost.asp?Text=Hello+World
而返回的结果是:
通过get方法传递来的字符串是: "Hello World"
最后再通过post方法提交,浏览器的url还是:
http://localhost/general/form/getpost.asp?Text=Hello+World
而返回的结果变成:
通过get方法传递来的字符串是: "Hello World"
通过Post方法传递来的字符串是: "Hello World"

提示
通过get方法提交数据,可能会带来安全性的问题。比如一个登陆页面。当

通过get方法提交数据时,用户名和密码将出现在URL上。如果:
1、 登陆页面可以被浏览器缓存;
2、 其他人可以访问客户的这台机器。
那么,别人即可以从浏览器的历史记录中,读取到此客户的账号和密码。所

以,在某些情况下,get方法会带来严重的安全性问题。
建议
在Form中,建议使用post方法。

 

 

 

比如:
www.blueidea.com/bbs/NewsDetail.asp?lp=1&id=2337607

传递的id参数就是get方法

而提交帖子一般是一个表单,选择post就不是转换为上面的这样的id=**&**=***的办法
接收方法也是不同的

asp里面
get 方法是 request.querystring("id"
post 方法是 request.form("id"

如果不指定,则两个方法递交的都可以得到 request("id"
冲突的话优先权是哪个我就不清楚了

Top
两者的区别需要通过提交表单后才看得出来,主要是在数据发送方式和接收方式上。

  具体步骤:

  Post和Get都是表单属性Method的可选值,Method的默认值为Get,两者的主要区别在于:

  1.在客户端,Get方式在通过URL提交数据,提交后在地址栏中的地址如图1.4.3所示。

图1.4.3 Get方式提交表单后的地址栏

  而Post提交后地栏不变,如图1.4.4所示。

图1.4.4 Post方式提交表单后的地址栏不变

  2.在服务器端只能用Request.QueryString来获取Get方式提交来的数据,用Post方式提交的数据只能用Request.Form来获取:

<%@language="VBScript" Codepage="936"%>
<html>
<head>
<title> 表单提交方式测试</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<form method="post" action="<%=Request.ServerVariables("Script_Name")%>">
  提交数据:
  <input name="oStr" type="text">
    <br>
    提交方式:
    <select name="select" οnchange="this.form.method=this.value">
      <option value="Post" selected>Post</option>
      <option value="Get">Get</option>
    </select>
    <br>
  <input type="submit" name="Submit" value="提交">
</form>
<%
 if Request("Submit")<>"" then
        Response.Write "通过"&Request.ServerVariables("Request_Method")&"方式提交的数据为:"
    if Request.ServerVariables("Request_Method")="GET" then
          Response.Write Request.QueryString("oStr")
    else
          Response.Write Request.Form("oStr")
    end if
end if
%>
</body>
</html>

  注意:虽然两种提交方式可以统一用Request("oStr")来获取提交数据,但是这样对程序效率有影响,不推荐使用。

  特别提示

  通过IIS运行本例代码(用http://localhost/method.asp这种方式来浏览,有关IIS的安装和配置,请参考第四部分),输入所提交的数据,选择Post方式提交,将看到图1.4.4所示的效果。选择Get方式提交,效果将如图1.4.3所示。

  特别说明

  一般来说,尽量避免使用Get方式提交表单,因为有可能会导致安全问题。比如说在登陆表单中用Get方式,用户输入的用户名和密码将在地址栏中暴露无遗。但是在分页程序中,用Get方式就比用Post好。本例中用到的表单的属性解释(ASP部分请参考第四部分):

    Get把参数添加到action属性指定的地址中,并以锚方式打开。

    Post通过HTTP post处理发送数据。




(下面是一个application程序的web请求提交实例)
using System;
using System.Net;
using System.IO;
using System.Text;
using System.Web;

class ClientPOST {
public static void Main(string[] args) {

if (args.Length < 1) {
showusage();
} else {
if (args.Length < 2 ) {
getPage(args[0], "s1=foods2=bart(&S)");
} else {
getPage(args[0], args[1]);
}
}

Console.WriteLine();
Console.WriteLine("按任意键继续...");
Console.ReadLine();

return;
}

public static void showusage() {
Console.WriteLine("尝试发送 (POST) 到 URL 中");
Console.WriteLine();
Console.WriteLine("用法::");
Console.WriteLine("ClientPOST URL [postdata]");
Console.WriteLine();
Console.WriteLine("示例::");
Console.WriteLine("ClientPOST http://www.microsoft.com s1=food&s2=bart");
}

public static void getPage(String url, String payload) {
WebResponse result = null;

try {

WebRequest req = WebRequest.Create(url);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";

StringBuilder UrlEncoded = new StringBuilder();
Char[] reserved = {'?', '=', '&'};
byte[] SomeBytes = null;

if (payload != null) {
int i=0, j;
while(i<payload.Length){
j=payload.IndexOfAny(reserved, i);
if (j==-1){
UrlEncoded.Append(HttpUtility.UrlEncode(payload.Substring(i, payload.Length-i)));
break;
}
UrlEncoded.Append(HttpUtility.UrlEncode(payload.Substring(i, j-i)));
UrlEncoded.Append(payload.Substring(j,1));
i = j+1;
}
SomeBytes = Encoding.UTF8.GetBytes(UrlEncoded.ToString());
req.ContentLength = SomeBytes.Length;
Stream newStream = req.GetRequestStream();
newStream.Write(SomeBytes, 0, SomeBytes.Length);
newStream.Close();
} else {
req.ContentLength = 0;
}


result = req.GetResponse();
Stream ReceiveStream = result.GetResponseStream();
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
StreamReader sr = new StreamReader( ReceiveStream, encode );
Console.WriteLine("/r/n已接收到响应流");
Char[] read = new Char[256];
int count = sr.Read( read, 0, 256 );
Console.WriteLine("HTML.../r/n");
while (count > 0) {
String str = new String(read, 0, count);
Console.Write(str);
count = sr.Read(read, 0, 256);
}
Console.WriteLine("");
} catch(Exception e) {
Console.WriteLine( e.ToString());
Console.WriteLine("/r/n找不到请求 URI,或者它的格式不正确");
} finally {
if ( result != null ) {
result.Close();
}
}
}
}


post方式对于以后制作Windows Application程序及WebRequest程序的安全性值得参考及应该使用
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值