今日工作心得:HttpContext.Response.Headers.Add 、HttpContext.Response.AddHeader 和HttpContext.Response.AppendHeader
2010-09-07 16:50 于为源 阅读(12423) 评论(0) 收藏 举报今天比较闲做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>
<%@ 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头操作比较好。
本文来自博客园,作者:于为源,转载请注明原文链接:https://www.cnblogs.com/yuanyuan/archive/2010/09/07/1820768.html
如果对您有帮助,您也可以请我喝杯可乐。
浙公网安备 33010602011771号