起名ASP.NET 高级编程基础第十篇—HttpHandler处理

(4)
用NPOI动态变化一个Excel表然后弹出对话框让用户下载,文件名是:”用户列表.xls”。

在看此文示例在此之前,请先看:CYQ.Data 轻量数据层之路
应用示例篇(四)
 –因为登记+登陆从那间接Copy的,那节就省过了。

        context.Response.WriteFile(“刘亦菲.jpg”);

起名 1起名 2

序言:好几天没有写博客了,前几天此起彼伏写咱俩的asp.net高级编程基础种类的第十篇,Httphandler处理,通过那篇博客大家得以通晓到Httphandler是个干什么的了,当然本来想写写这一个底层的,可是思想我们得以友善查一下,所以就从不写了,希望大家能够共同升高。

 

新建一个ashx项目,起名为访问者音信.ashx项目,在其中写入如下代码:

/// <summary>
/// 路过秋季 http://cyq1162.cnblogs.com
/// </summary>
public class PageBase:System.Web.UI.Page,ICallbackEventHandler
{
    #region ICallbackEventHandler 成员
    /// <summary>
    /// Ajax方法时的回调结果
    /// </summary>
    public string ajaxCallBackResult = null;
    /// <summary>
    /// 注册Ajax方法
    /// 调用方法名:callAjax(arg)
    /// 回调方法名:callBack(result)
    /// </summary>
    public void RegisterAjax()
    {
        RegisterAjax(this, “callAjax”, “callBack”);
    }
    public void RegisterAjax(Control ct, string functionName, string callBackName)
    {
        if (!ct.Page.ClientScript.IsClientScriptBlockRegistered(functionName))
        {
            string callBack = ct.Page.ClientScript.GetCallbackEventReference(ct, “arg”, callBackName, null);
            string clientFunction = “function ” + functionName + “(arg){” + callBack + “}”;
            ct.Page.ClientScript.RegisterClientScriptBlock(ct.Page.GetType(), functionName, clientFunction, true);
        }
    }
    public string GetCallbackResult()
    {
        return ajaxCallBackResult;
    }
    public virtual void RaiseCallbackEvent(string eventArgument)
    {
        
    }
    public virtual void RegisterCommonScript()
    {
        const string script = @”function $(id){return document.getElementById(id)}function $V(id,defaltValue){if($(id)){if(defaltValue && $(id).value.length==0){return defaltValue;} else{return $(id).value;}}return ”;}”;

  1. HttpHandler完结文件下载

回调时结果:

(2) 案例1:图片中显示访问者的新闻

先上图,全体项目境况:

  

看下Send:

(1)
HttpHandler是对请求的响应,可以输出普通的Html内容,也可以出口图片,也得以输出一个文书。

骨子里,Ajax唯有两局地:

  1. ASP.NET补充难点

1:左侧区为聊天显示区
2:左边上头为欢迎与脱离
3:左侧下头为用户列表区
4:底部就是留言区了
5:ajax定时刷新用2.0内置ICallBack接口落成。

(2)
方便开发不用每回调试都设定起初页,在项目中的选项中设定[web]—>启动操作—>当前页面—>那样当前激活的页面就是发轫页。

 

(3) 案例2:填入朋友的名字,就可见生成要恶搞的图样连接

起名:Chat

 1  context.Response.ContentType = "application/x-excel";
 2 
 3    string filename = HttpUtility.UrlEncode("动态数据.xls");
 4 
 5    context.Response.AddHeader("content-Disposition", "attachment:filename=" + filename);
 6 
 7    HSSFWorkbook workbook = new HSSFWorkbook();
 8 
 9    HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet();
10 
11    HSSFRow row = (HSSFRow)sheet.CreateRow(0);
12 
13    HSSFCell cell = row.CreateCell(0, HSSFCell.CELL.TYPE.STRING);
14 
15    row.setCellValue("Hello");
16 
17    row.CreateCell(0, HSSFCell.CELL.TYPE.STRING).SetCellValue(3.14);
18 
19    workbook.Write(context.Response.OutputStream);

三:项目始于:

<a href=”下载.ashx”>下载</a>

    void LoadMyInfo()
    {
        if (Session[“ID”] == null)
        {
            Response.Redirect(“Login.aspx”);
        }
        else
        {
            Session[“ID”] = Session[“ID”];
            myID =Convert.ToInt32(Session[“ID”]);
            MAction action = new MAction(TableNames.Users);
            if (action.Fill(myID))
            {
                action.SetTo(labUserName);
            }
            else
            {
                labUserName.Text = “读取数据败北!”;
            }
            action.Close();
        }
    }
    protected void btnLogout_Click(object sender, EventArgs e)
    {
        Session[“ID”] = null;
        Response.Redirect(“Login.aspx”);
    }

 1      context.Response.ContentType = "Image/JPEG";
 2 
 3      using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(300, 300))
 4 
 5      {
 6 
 7           using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap))
 8 
 9           {
10 
11               g.DrawString("IP地址是:" + context.Request.UserHostAddress, new System.Drawing.Font("宋体", 20), System.Drawing.Brushes.Red, 0, 0);
12 
13               g.DrawString("操作系统:" + context.Request.Browser.Platform, new System.Drawing.Font("宋体", 20), System.Drawing.Brushes.Red, 0, 50);
14 
15               g.DrawString("浏览器信息:" + context.Request.Browser.Type, new System.Drawing.Font("宋体", 20), System.Drawing.Brushes.Red, 0, 100);
16 
17            }
18 
19     bitmap.Save(context.Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);
20 
21        }

要么和上次示范一下,自定义语句放到类里统一管理了:

 4) 在下载.htm中写入如下代码

 

        context.Response.ContentType = “Image/JPEG”;

起名 3

 1      context.Response.ContentType = "Image/JPEG";
 2 
 3         string name = context.Request["Name"];
 4 
 5         string fullPath = HttpContext.Current.Server.MapPath("刘亦菲.jpg");
 6 
 7         using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(fullPath))
 8 
 9         {
10 
11             using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap))
12 
13             {
14 
15                 g.DrawString(name, new System.Drawing.Font("宋体", 20), System.Drawing.Brushes.Red, 113, 35);
16 
17             }
18 
19             bitmap.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
20 
21         }

吸纳音讯时:

 3) 新建一个一般处理程序下载.ashx

唯独依旧要提供所有示例下载:点击下载 [数据库成立脚本在App_Data目录下]

 <a href=”DownLoadExcel.ashx”>下载Excel</a>

再看下GetMessage:

 1) 新建一个asp.net
web应用程序起名为导出excel.aspx,新建一个BLL文件夹,下载NPOI的富有dll文件加到文件夹上边,添加dll引用。

1:登陆者名称与脱离事件

2) 新建一个一般处理程序DownLoadExcel.ashx,在其中写入如下代码:

//组合成 命令:用户ID:留言内容
callAjax(“0:”+$V(‘hdfUserID’)+”:”+$(‘txtBody’).innerHTML);

 

发送音信时:

 2) 新建一个1.txt文书,乱写一些事物,在下载页面中写入如下代码:

起名 4起名 5

(1)
如若HttpHandler输出的是HTML,txt,jpeg等类其余音讯,那么浏览器会间接展现,如若希望弹出保存对话框,则需求丰富

关于这多个,大家看一下ICallBack的落到实处:

Response.AddHeader(”content-Disposition”,string.Format(”attachment;filename=\”{0}\””,encodeFileName));其中filename前面为编码后的公文名,filename段为提出的保留文件名。

一样发出webconfig后添加好数据库链接!

        context.Response.AddHeader(“content-Disposition”,
“attachment:filename=刘亦菲.jpg”);

起名 6起名 7

   <a href=”刘亦菲.jpg”>图片1</a>

        Page.ClientScript.RegisterClientScriptBlock(this.Page.GetType(), “GetBy”, script, true);
    }
    #endregion
}

  1. HttpHandler处理

地点又有一个自定义的CustomerSQL.Message,其实我应该用一下仓储进度来演示的,算了,写都写了:

 

    function callBack(result)
    {
       var  items=result.split(‘☆’);     
        switch(items[0])
        {
            case “0”://发送音讯再次回到结果
                $(‘btnSend’).disabled=false;
                add($V(‘hdfBody’));
                break;
            case “1”://查询重临结果
                if(items.length>1)
                {
                    msgMaxID=items[1];
                }
                if(items.length>2)
                {
                    add(items[2]);
                }
                break;
        }
   }

Header:string encodeFileName=HttpUtility.UrlEncode(“过滤词.txt”);

1:点提交时,用户音讯要ajax提交到后台入库:
2:用户定时去取信息

(1)
WebApplication每一遍修改将来点击[转变解决方案],也能登时看到修改结果,不要求再一次开动浏览器。原理:生成未来才将扭转的部分生成dll,而webSite则是历次访问页面的时候会检查cs文件是不是变动了,变化了则另行活动编译,所以每一次修改将来都会马上有功能的。

 

 

 

   

2:用户登陆(Reg.aspx:见示例篇(四))

(3)
动态输出用处,不要再把资源保存到磁盘下面在输出(不会有文件重名的题材,文件不成形在服务器端)。案例:点击链接弹出图片下载对话框,web原则,能直接将转变的内容以流的样式出口给浏览器,就无须转移临时文件夹,

 

   <a href=”1.txt”>txt下载</a>

 

(2) 1) 新建一个下载.html页面,写入如下代码:

 

1)新建一个形似处理程序.ashx,在其中写入如下代码,验证的话在浏览器输入参数。

起名 8起名 9

OK,现在看一下Default.aspx的Page_Load里调用一下:

起名 10

 

一如既往为了能一篇介绍完一个示范,我不难挑选了眨眼间间,本次的演示为:注册+登陆+在线聊天[节约了私聊部分]

起名 11起名 12

回来时:也要预定好分隔符,那里为“☆”号;

二:项目上马

   function add(msg)
   {
        if(msg)
        {
             $(‘left’).innerHTML+=msg;
            
$(‘left’).scrollTop=$(‘left’).scrollHeight;//滚动条稳定到最前边
        }
   }

 

2:添加引用:CYQ.Data.dll

接下去就是贯彻四个函数Send与GetMessage了。

3:变动分页查询存储进程与枚举:如故页面:WriteOut.aspx,用于转移输出:

    void LoadListInfo()
    {
        int rowCount;
        MAction action = new MAction(TableNames.Users);//加载用户列表
        rptUserList.DataSource = action.Select(0,0,”ID<>”+myID,out rowCount);
        rptUserList.DataBind();
        if (action.ResetTable(CustomerSQL.Message))//切换表到留言列表,加载留言列表
        {
            rptMessageList.DataSource = action.Select(1, 10, “”, out rowCount);
            rptMessageList.DataBind();
            action.Close();
        }
    }

继上一篇:CYQ.Data 轻量数据层之路 华丽升级
V1.3出世(五)
,本篇趁周末同时是下班时间看贴人不多,低调让其入手应用一下:

两个表:Users+Message,上图:

 

//组合成 命令:最大信息ID
callAjax(“1:”+msgMaxID);

public override void RaiseCallbackEvent(string eventArgument)
    {
        int splitIndex = eventArgument.IndexOf(‘:’);
        string cmd = eventArgument.Substring(0, splitIndex);
        string data = eventArgument.Substring(splitIndex+1);
        switch (cmd)
        {
            case “0”://送发音信
                ajaxCallBackResult = “0☆” + Send(data);
                break;
            case “1”://查询音讯
                ajaxCallBackResult = “1☆” + GetMessage(data);
                break;
        }
    }

2与3:绑定用户列表与后十条留言

4:接下去是Ajax部分了

private const string msg = “<div class=\”msg\”><font color=\”Olive\”>{0}</font> 对 <font color=\”Olive\”>{1}</font> 说 <font color=\”Olive\”>{2}</font><br /><p>{3}</p></div>”;
    string GetMessage(string maxID)
    {
        string result=””;
        MAction action = new MAction(CustomerSQL.Message);
        if (maxID ==”0″)
        {
            if (action.Fill(“1=1 order by id desc”))//取最大ID返回
            {
                result = action.Get<string>(Message.ID)+”☆”;
                action.Close();
            }
        }
        else
        {
            int rowCount;
            MDataTable mTable = action.Select(0, 0, string.Format(“ID>{0} and SendUserID<>{1} and (RecvUserID=0 or RecvUserID={1})”, maxID, myID), out rowCount);
            action.Close();
            if (rowCount > 0)
            {
                result = mTable.Rows[rowCount – 1][“ID”].Value + “☆”;
                foreach (MDataRow row in mTable.Rows)
                {
                    result += string.Format(msg,row[“UserName”].Value, row[“UserName2”].Value,row[“PubTime”].Value,row[“Body”].Value);
                }
            }
            else
            {
                result += maxID + “☆”;
            }
        }
        return result;
    }

其余具体html代码就不详细贴出来了,因为自身了解,我下面代码贴的再详尽,推断也没几个人看,大伙看个早先,然后往下拉,看到源码下载,点击下载,大概就拍拍屁股走人了

 

转移分页存储进程新措施:CYQ.Data 轻量数据层之路 华丽升级
V1.3出世(五)
:[9:OutPutData:扩张ExeCreateProc方法用于直接实施生成分页存储进程]

1:登记用户(Login.aspx:见示例篇(四))

 

分区域表明:

起名 13起名 14

页面进来时,把能加载的都加载完:唯有八个点[1:登陆者名称;2:用户列表;3:默许取10条留言显示]

起名 15起名 16

收受时:该代码和前台html约定好分隔符,这里为“:”号;

 

起名 17起名 18

3:在线聊天:(Default.aspx)

 

 string Send(string msg)
    {
        int splitIndex=msg.IndexOf(‘:’);
        string[] content = msg.Split(‘☆’);//内容为接收者ID☆信息内容
         MAction action = new MAction(TableNames.Message);
        action.Set(Message.SendUserID, myID);
        action.Set(Message.RecvUserID,msg.Substring(0,splitIndex));
        action.Set(Message.Body, msg.Substring(splitIndex+1));
        string result = action.Insert() ? “1” : “0”;
        return result;
    }

 

先上图,聊天主界面:

public partial class _Default :PageBase
{
    int myID;
    protected void Page_Load(object sender, EventArgs e)
    {
        LoadMyInfo();
        LoadListInfo();
        RegisterCommonScript();
        RegisterAjax();
    }
//…省略N行代码…
}

一:数据库

此地我封装了瞬间,新建了个PageBase类放里面了,看一下PageBase.cs代码:

1:新建网站项目起名,,如起名叫:Cyq.Data.ChatDemoProject

5:前台HTML/JS

起名 19

 

起名 20起名 21

 

当下条件一致是:VS2005+SQL2005,以下进入正题:

证实:和上一示例相比:Users表是均等的,Message表也大致相同了。

 

/// <summary>
/// by 路过春季 http://cyq1162.cnblogs.com/
/// </summary>
public class CustomerSQL
{
    public const string Message = “(SELECT m.*,uA.UserName,isnull(uB.UserName,’所有人’) AS UserName2 FROM Message m LEFT JOIN Users uA ON m.SendUserID=uA.ID LEFT JOIN Users uB ON m.RecvUserID=uB.ID) v”;
}

代码有点长,如同不太好了然,因为和前台html界面相关的关联:其实就是组成字符串输出了。

 欢迎感兴趣读者谈谈与留言:[地方代码注释太少,在测试使用中,如有不明请留言]。[写个示例花了1钟头,写篇小说花了一天了,不易于啊!]

 

上边进行代码演说:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图