【.net项目中。。】.net一般处理程序使用方法

1.基本原理图



IsReusable属性用来表示在IHttpHandlerFactory对象创建IHttpHandler的时候是否能够将这个Handler存入池中以便重用。

一般处理程序(HttpHandler):是一个实现System.Web.IHttpHandler接口的特殊类。任何一个实现了IHttpHandler接口的类,是作为一个外部请求的目标程序的前提。(凡是没有实现此接口的类,就不能被浏览器请求。)

它由支持ASP.NET的服务器调用和启动运行。一个HttpHandler程序负责处理它所对应的一个或一组URL地址的访问请求,并接收客户端发出的访问请求信息(请求报文)和产生响应内容(响应报文)。

简单的说:咱可以通过创建一个我们自己的HttpHandler程序来生成浏览器代码发送回客户端浏览器。

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

  1.获取客户端通过HTML的Form表单提交的数据和URL参数

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

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

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

  5.调用其他类

2.生命周期:



请求管道的19个事件:

(1)BeginRequest: 开始处理请求

(2)AuthenticateRequest授权验证请求,获取用户授权信息

(3):PostAuthenticateRequest获取成功

(4): AunthorizeRequest 授权,一般来检查用户是否获得权限

(5):PostAuthorizeRequest:获得授权

(6):ResolveRequestCache:获取页面缓存结果

(7):PostResolveRequestCache 已获取缓存 当前请求映射到MvcHandler(pr): 创建控制器工厂 ,创建控制器,调用action执行,

view→response

(8):PostMapRequestHandler 创建页面对象:创建 最终处理当前http请求的 Handler 实例: 第一从HttpContext中获取当前的PR Handler

  ,Create

(9):PostAcquireRequestState 获取Session

(10)PostAcquireRequestState 获得Session

(11)PreRequestHandlerExecute:准备执行页面对象
   执行页面对象的ProcessRequest方法

(12)PostRequestHandlerExecute 执行完页面对象了

(13)ReleaseRequestState 释放请求状态

(14)PostReleaseRequestState 已释放请求状态

(15)UpdateRequestCache 更新缓存

(16)PostUpdateRequestCache 已更新缓存

(17)LogRequest 日志记录

(18)PostLogRequest 已完成日志

(19)EndRequest 完成、

3.一个小例子——前台实现用户名的验证



在说一般处理程序之前,先来看看什么是aspx。在vs中,使用的大多是aspx页面。aspx页面就
是在接收到一个请求之后,将返回的结果生成一个html页面返回给服务器。当我们有时候需要自己来处理这个结果,而不是直接返回html的时候。怎么做呢?这时候就需要一般处理程序了。一般处理程序就是这样一个只有cs页面,而没有前台的文件。扩展名为ashx。

实例验证用户名

JS

<script type="text/javascript" >

//验证用户名是否正确
function JudgeUserName() {
var username = $("#userName").val()
$.ajax({
type: "Post",
url: ‘RegisterUserNameVerity.ashx/ProcessRequest?username=‘+username,
success: function (result) {
if (username == "") {
alert("用户名不能为空!");
document.getElementById("userName").focus();
document.getElementById("userName").selected;

} else {
if (result == "True") {
alert("已存在,请您重新选择一个用户名!")
document.getElementById("userName").focus;
document.getElementById("userName").select();
} 

}
},
});
}

</script>

  

Html

<input type="text" onblur="JudgeUserName()" />

一般处理程序

 1 public void ProcessRequest(HttpContext context)
 2 {
 3 //获取从前台传过来
 4 string userName = context.Server.UrlDecode(context.Request.QueryString["username"]);
 5 //声明查询用户名是否存在的对象
 6 userBLL verifyusernamebll = new userBLL();
 7 //通过其他的函数来判断
 8 bool flag=verifyusernamebll.Exists(userName);
 9 if (flag==true)
10 {
11 context.Response.Write(true);
12 }
13 else
14 {
15 context.Response.Write(false);
16 }
17 }

一般处理程序

总结

这就是在前台直接可以不通过刷新来进行对用户名的校验,简单的一个小demon。关于一般处理程序,关键的地方就是在前台如何来需要的值传入到后台。这样在只要在一般处理程序拿到了前台的值后,那么操做起来就简单的多了。这里的值直接放在链接里面传过来的。

总结一下就三点:

1.传值,调用一般处理程序
2.处理,将结果返回给前台
3.前台处理返回的结果

4.一般处理程序ashx调用Session的方法



如何在ashx页面获取Session值?
请注意以下描红部分:
==========================

在一般事务处理页面,可以轻松的得到 Request,Response对象,从而进行相应的操作,如下:

HttpRequest Request = context.Request;

HttpResponse Response = context.Response;

但是要得到 Session的值就没有那么简单了。比如你要在ashx得到保存在Session中的登录帐号Session["userAccount"]

如果你只是context.Session["userAccount"]的话是会报 “未将对象引用设置到对象的实例”的异常

所以,如果要想取Session中的值 ,需要如下所示

1、引入 命名空间:

using System.Web.SessionState;

2、实现IRequiresSessionState接口,具体如下

/// <summary>
    /// $codebehindclassname$ 的摘要说明
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class AddUserInfo : IHttpHandler,IRequiresSessionState //就是这样显示的实现一下,不用实现什么方法
    {

public void ProcessRequest(HttpContext context)
        {

      //...

       //这样你就可以如下 操作了

if(context.Session["userAccount"] != null)

      {

        string account = context.Session["userAccount"].ToString();

      }

      //...继续下面的代码

    }

  }

5.深入解释一般处理程序运行过程



服务器怎么接收和发送数据?

在一般处理程序里,通过ProcessRequest方法的参数HttpContext context调用

系统对象 作用
Page       指向页面自身的方式。作用域为页面执行期。
HttpRequest   读取客户端在Web请求期间发送的值(http请求报文数据)
HttpResponse   封装了页面执行期返回到HTTP客户端的输出(http响应报文数据)
HttpApplication  作用于整个程序运行期的状态对象
Session      会话期状态保持对象,用于跟踪单一用户的会话。
Cookie       客户端保持会话信息的一种方式
Server       提供对服务器上的方法和属性的访问

Request(HttpRequest) & Response(HttpResponse)

一、浏览器提交数据方式?(例) get/post

1.表单:(数据藏在请求报文体中,格式:txtname=james&txtpwd=123) <form action=“login.ashx” method=“post”> <input type=“text” name=“txtname” /> <input type=“password” name=“txtpwd”/> </form>

2.地址栏的URL参数,超链接的url,js指定的url(和表单的Get方式一样):键值对http://127.0.0.1/login.ashx?txtname1=jordan&txtpwd1=123

二、服务器如何获取浏览器提交的数据?

1.获取POST数据:context.Request.Form[“txtname”]

2.获取GET参数:context.Request.QueryString[“txtname1”]

三、服务器如何向浏览器输出数据?

context.Response.Write(“我是从服务器输出到浏览器的数据!:)”);

Request(HttpRequest)常用成员

页面间传递数据的几种方式?(get/post : 超链接,location,js的submit(),表单提交按钮)

入门1.html

<form action="入门1.ashx"> <input type="text" name="username" /><input type="submit" /> </form>

新建一个【一般处理程序】入门1.ashx, ProcessRequest中写

context.Response.ContentType = "text/html";

string username = context.Request["username"];

context.Response.Write(username + "<font color=‘red‘>你好</font>"+Guid.NewGuid());//根据当前电脑的硬件编号+系统时间微秒数

每当用户请求访问ashx页面的时候,ProcessRequest方法就会被调用,在这里通过访问context.Request获得访问者的请求参数等。然后在ProcessRequest中通过context.Response向浏览器发回数据给浏览器。ProcessRequest结束之时就是服务器为这个浏览者本次访问服务完成之时

浏览器向服务器端提交数据,被提交数据的表单(input、select、textarea等)放到form中,form中通过action属性设定表单被提交给哪个页面,为了在服务端取出表单项的值,需要在HTML中为表单元素设定name属性,注意id是给JS操作Dom用的,name才是提交给服务器用的。在服务器端用context.Request["username"]来根据表单项的name来获得提交的属性值。通过context.Response.Write向浏览器输出处理后的显示HTML内容。

当我们点击【提交】按钮以后是浏览器将用户填写的文本框等控件中的值“提取”出来发送给服务器,而不是服务器来读取用户填写的这个页面。哪些标签的哪些值会被提交给服务器呢?将用户填写的内容提交到服务器有如下几个条件:

只能为 input、textarea、select三种类型的标签。只有input(文本框、CheckBox等)用户才可能填写值,<label>、<p>、<font>等标签仅供显示用,没有提交到服务器的必要。

只有value属性的值才会提交给服务器。以input标签为例,input标签有title、type、disabled等属性,但是这些属性都是供显示用的,用户并不能修改,只有value属性才是用户输入的属性,因此只有value属性的值才会被提交到服务器。

标签必须设定name属性。学习Dom的时候我们知道如果要通过JavaScript操作标签,必须为标签设定Id。如果要将标签的value属性值提交到服务器,则必须为标签设定name属性,提交到服务器的时候将会以“name=value”的键值对的方式提交给服务器,多个键值对之间用&分割。除了单选按钮等少数标签之外,大部分标签的name的值不能重复。name是给服务器用的,id是给Dom用的。对于RadioButton,同name的为一组,选中的RadioButton的value被提交到服务器。

如果设置了控件的disabled属性的话,浏览器也不会提交该控件的值。

放到form标签内。只有放到form标签内的标签才可能会被提交到服务器,form之外的input等标签被忽略。

时间: 2025-01-21 19:20:57

【.net项目中。。】.net一般处理程序使用方法的相关文章

项目记录:spring+springmvc 项目中 @Transactional 失效的解决方法

第一步,修改spring的配置文件和springmvc的配置文件 --------------------------------applicationContext.xml <context:annotation-config/>  <context:component-scan base-package="com.xxx"> <context:exclude-filter type="annotation" expression=&

Android 项目中执行java的main方法

Android 项目中执行java的main方法 导语 今日,在android项目中写了一个工具类,为了简单测试一下输出,就只直接在类中加上了main方法,于是问题来了: 解决方法是网上找到了,已经解决了,在此记录一下. 右击项目名,调出Properties窗口,打开Run/Debug Settings 标签,右边即列出了这个项目中含有main方法的所有java类,双击你要允许的java类:

在C#的Web项目中调用Matlab代码的方法

为了毕设的图形检索方向的研究,本人需要在信科的师兄师姐们已经完成的C#界面中,调用现在研究的算法的Matlab代码,以便看到实验的效果.前段时间已经拖延了1个多月,一方面因为实习越来越多事情,时间减少了很多:但更重要在于C#调用Matlab的方法真心麻烦,C#的Web项目中进行这个操作貌似会碰到更多细节上的问题.而且总是很不稳定,操作系统.Matlab或VS的版本.遗漏一些文件或步骤都会造成失败!这个问题本人已经搞了很长时间,直至前几天,在同学的帮助下,自己再弄一遍,总算成功了!下面我及时把这个

swift项目中使用OC/C的方法

假如有个OC类OCViewController : UIViewController类里有两个方法 //swift调用oc或c的混编是比较常用的,反过来的调用很少.这里只写了swift调用oc和c的方式.//OC函数声明- (void)testOC;//C函数声明void testc(); 实现:void testc(){  printf("testc.....................");} -(void)testOC{  NSLog(@"\ntestOC.....

angular6项目中使用echarts图表的方法(有一个坑,引用报错)

1.安装相关依赖(采用的webpack) npm install ecahrts --save npm install ngx-echarts --save 2.angular.json 配置echarts路径 "scripts": [ "node_modules/echarts/dist/echarts.min.js", "node_modules/echarts/map/js/china.js", "node_modules/ech

项目中使用过的lodash方法总结

_.findWhere 对集合中的每个元素和源进行深度比较. 该方法支持比较数组.布尔值.数字.日期对象,对象的对象,正则表达式.字符串. Ex: var users = [ { 'user': 'barney', 'age': 36, 'active': true }, { 'user': 'fred',   'age': 40, 'active': false } ]; _.result(_.findWhere(users, { 'age': 36, 'active': true }), '

web项目中的跨域问题解决方法

一种是JSONP 一种是 CORS. 在客户端Javascript调用服务端接口的时候,如果需要支持跨域的话,需要服务端支持. JSONP的方式就是服务端对返回的值进行回调函数包装,他的优点是支持众多的浏览器, 缺点是仅支持Get的方式对服务端请求. 另一种主流的跨域方案是CORS,他仅需要服务端在返回数据的时候在相应头中加入标识信息.这种方式非常简便.唯一的缺点是需要浏览器的支持,一些较老的浏览器可能不支持CORS特性. 跨域支持是创建WebService时应该考虑的一个功能点,文中是使用Se

在cocos2dx的android项目中,怎么让onKeyDown方法执行

首先,进入到引擎目录的cocos\platform\android\java\src\org\cocos2dx\lib,打开Cocos2dxGLSurfaceView.java文件, 找到onKeyDown方法,方法如下: public boolean onKeyDown(final int pKeyCode, final KeyEvent pKeyEvent) { switch (pKeyCode) { case KeyEvent.KEYCODE_BACK: Cocos2dxVideoHelp

SuperDiamond在JAVA项目中的三种应用方法实践总结

一.直接通过PropertiesConfiguration来根据key读取value.二.将SuperDiamond配置参数注入spring配置文件,使用Spring来加载.三. 在Spring中配置SuperDiamond(无参数),然后通过RunTime参数来加载SuperDiamond配置. 1.直接读取如下:       @Test public static void test_simple(){ PropertiesConfiguration config = new Propert

项目中常用的C# 扩展方法

///我们经常使用一些匿名委托来处理一些逻辑///但是在某些情况下,有可能委托是null,要是直接执行可能会抛异常///所以提供此扩展方法,直接可以使用例如 action.Execute() 来执行 namespace System { public static class ActionExtension { public static void Execute(this Action action) { if (action != null) { action(); } } public s