欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

初始ASP.NET---一般处理程序

程序员文章站 2022-07-01 15:08:08
问题来源: 今天在敲一个小的demo,利用jquery实现级联下拉框,敲的过程中发现无论怎么和对照都无法显示想要的功能。这才想着原来是没有写后台代码,询问一清同学的时候,他告诉我可...

问题来源:

今天在敲一个小的demo,利用jquery实现级联下拉框,敲的过程中发现无论怎么和对照都无法显示想要的功能。这才想着原来是没有写后台代码,询问一清同学的时候,他告诉我可以利用asp.net的一般处理程序。

我果然是菜鸟初学者,因为我还没有接触过一般处理程序!

什么是一般处理程序:

一般处理程序:是一个实现system.web.ihttphandler接口的特殊类。任何一个实现了ihttphandler接口的类,是作为一个外部请求的目标程序的前提。(凡是没有实现此接口的类,就不能被请求。)它由支持asp.net的服务器调用和启动运行。 一个httphandler程序负责处理它所对应的一个或一组url地址的访问请求,并接收客户端发出的访问请求信息(请求报文)和产生响应内容(响应报文)。

优点:轻量化、效率较高

创建一个一般处理程序将会生成两个后缀名的文件.ashx和.ashx.cs。ashx里只有一个指令集,没有任何其他代码;ashx.cs就是页面处理代码。如果有大量html,需要通过ashx来拼接字符串或读取模板的方式完成。其中.ashx.cs对应的内容,如以下代码:

using system;  
using system.collections.generic;  
using system.linq;  
using system.web;  
  
namespace web  
{  
    ///   
    /// handler 的摘要说明  
    ///   
    public class handler : ihttphandler  
    {  
        public void processrequest(httpcontext context)  
        {  
            context.response.contenttype = text/plain;  //表示输出结果类型
            context.response.write(hello world);  //输出结果
        }  
  
        public bool isreusable  
        {  
            get  
            {  
                return false;  
            }  
        }  
    }  
}  

(1)httpcontext: 请求上下文对象,包含:请求报文对象(httprequest),响应报文对象(httpresponse),服务器帮助类(server),session等。

 

(2)framework在接收到请求后,通过反射技术创建请求路径对应的类的对象,并强制转换成ihttphandler接口对象(httphandler实现了ihttphandler,之后的转换相当于将子类强转为父类),统一调用processrequest方法处理。
(3)isreusable属性用来表示在ihttphandlerfactory对象创建ihttphandler的时候是否能够将这个handler存入池中以便重用。

(4)contenttyp属性是一般处理程序输出响应内容,输出的内容有可能是图片、html等其他页面,浏览器根据响应报文体内容不知道接收到的是什么,需要判断响应报文头里的contenttype来决定将报文体内容作为何种格式的数据来显示。(image/jpeg----表示输出的是图片,text/plain--------表示输出文本)

 

从上面的代码可以看到,一般处理程序实际上就是一个实现ihttphandler接口的处理程序类,这个处理程序被asp.net直接在配置文件映射到了ashx扩展名的请求上。这样,我们就不需要在配置文件中进行配置了。

具体的用途:

 

httphandler程序可以完成普通类程序所能完成的大多数任务:

1.获取客户端通过html的form表单提交的数据和url参数

2.创建对客户端的响应消息内容

3.访问服务器端的文件系统

4.连接并开发基于数据库的应用

5.调用其他类

 

using system;  
using system.collections.generic;  
using system.linq;  
using system.web;  
  
namespace web  
{  
    ///   
    /// handler 的摘要说明  
    ///   
    public class handler : ihttphandler  
    {  
        public void processrequest(httpcontext context)  
        {  
            context.response.contenttype = text/plain;  //表示输出结果类型
            context.response.write(hello world);  //输出结果
        }  
  
        public bool isreusable  
        {  
            get  
            {  
                return false;  
            }  
        }  
    }  
}  

 

具体的运用:

下面是利用jquery实现级联下拉框效果中,需要用一般处理程序获得汽车类型的一般处理程序的代码。

 

 public class handler1 : ihttphandler
    {
        public void processrequest(httpcontext context)
        {
            context.response.contenttype = text/plain;
            string strcarname =context.request[carnamevalue].tostring();
 
            sqlconnection conn = new sqlconnection(server=.;database=car;uid=sa;pwd=123456;);   //定义连接字符串
            conn.open();     //打开连接
            sqldataadapter sdr = new sqldataadapter();
            sdr.selectcommand =new sqlcommand (selectid,cartype from t_cartype where carnameid=' + strcarname + ',conn);
 
            datatable dt = new datatable();
 
            sdr.fill(dt);
            string str =datatabletojson(1, dt);
            context.response.write(str);
        }
 
        public bool isreusable
        {
            get
            {
                return false;
            }
        }
}

 

总结:

其实理论知识再好不会用也只会停留在理论层面。而又是这么奇怪的一个东西无论别人讲得多么的详细,都比不上自己的一次实践。文中所提到的demo源码,文章最后会附有下载链接。