zoukankan      html  css  js  c++  java
  • 【.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等标签被忽略。

  • 相关阅读:
    pandas Dataframe filter
    process xlsx with pandas
    data manipulate in excel with easyExcel class
    modify registry in user environment
    add number line in vim
    java import webservice
    ctypes MessageBoxA
    music 163 lyrics
    【python实例】自动贩卖机
    【python基础】sys模块(库)方法汇总
  • 原文地址:https://www.cnblogs.com/huiyuan/p/aijiang.html
Copyright © 2011-2022 走看看