今天比较闲做ajax的练习的时候发现了一个比较奇怪的现象,就是写好的handler.ashx不能正常工作。后来查看了一下是这三个方法的区别造成的。
第一版的程序:
aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="demoHeader.aspx.cs" Inherits="demoHeader" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <script type="text/javascript" language="javascript"> var r = new XMLHttpRequest; function add() { var a = document.getElementById("a").value; var b = document.getElementById("b").value; var url = "HandlerHeader.ashx"; r.onreadystatechange = function() { if (r.readyState == 4) { if (r.status == 200) { document.getElementById("result").innerHTML = r.getResponseHeader("c"); } } }; r.open("POST", url, true); r.setRequestHeader("a", a); r.setRequestHeader("b", b); r.send(null); } </script> </head> <body> <form id="form1" runat="server"> <div> <input id="a" type="text" /> <input id="b" type="text" /> <input id="btn" type="button" value="GetSum" onclick="add();" /> <div id="result"> </div> </div> </form> </body> </html>
ashx:
<%@ WebHandler Language="C#" Class="HandlerHeader" %> using System; using System.Web; public class HandlerHeader : IHttpHandler { public void ProcessRequest (HttpContext context) { context.Response.ContentType = "text/plain"; int a = Convert.ToInt32(context.Request.Headers["a"]); int b = Convert.ToInt32(context.Request.Headers["b"]); int c = a + b; //context.Response.Write(c.ToString()); context.Response.Headers.Add("c", c.ToString()); } public bool IsReusable { get { return false; } } }
不能正确运行,直接在浏览器中查看handler,ashx页面,提示“context.Response.Headers.Add("c", c.ToString()) ”这句代码需要在IIS集成管线中运行。从元数据查看该方法的注释说明中有这样的描述“操作要求 IIS 7.0 处于集成管线模式,并且要求 .NET Framework 至少为 3.0 版本。”。而我的iis是6.0的,估计是因为这个才不行吧,没有在IIS7.0上试是不是可以。
后来把这一句改成了context.Response.AddHeader("c", c.ToString());和context.Response.AppendHeader("c", c.ToString());都是可以的。
后边这两句话的注释说明中写着作用是将http头添加到输出流,不同的是前者有这样一句话“提供 System.Web.HttpResponse.AddHeader(System.String,System.String)是为了与 ASP 的先前版本保持兼容。”
由此我推断,比较好的做法是使用后者:context.Response.AppendHeader("c", c.ToString());做http头操作比较好。