• ASP.NET 一般处理程序


    https://www.cnblogs.com/Tan-sir/p/4687477.html

    正文

    一般处理程序

    HTTP协议

    连接:浏览器和服务器之间的连接,当请求完毕后,会关闭连接。

    请求(Request):浏览器向服务器发出请求,我需要什么。

     GET / HTTP/1.1表示向服务器用GET方式请求首页,使用HTTP/1.1协议
     User-Agent(简称UA)为浏览器的版本信息。通过这个信息可以读取浏览器是IE还是FireFox、支持的插件、.Net版本等。看看IE和Chrome的UserAgent不一样
     Referer:来源页面、所属页面
     Accept-Encoding:服务器支持什么压缩算法。Accept-Language:浏览器支持什么语言。

    响应(Response):服务器响应浏览器,返回浏览器请求的数据。

     响应码:“200” : OK; “302” : Found 暂时转移,用于重定向, Response.Redirect()会让浏览器再请求一次重定向的地址,重定向的请求是Get方式; "404" : Not Found 未找到。500 服务器错误(一般服务器出现异常),通过报错信息找出异常的点。403:客户端访问未被授权。304(服务器把文件的修改日期通过Last-Modified返回给浏览器,浏览器缓存这个文件,下次向服务器请求这个文件的时候,通过If-Modified-Since问服务器说“我本地的文件的修改日期是。。。”,服务器端如果发现文件还是那个文件,则告诉浏览器(304 Not Modified)文件没修改,还用本地的吧。ctrl+f5)。2xx:没问题;3xx代表浏览器需要干点啥;4***浏览器的问题;5xx服务器错误
    服务器通过Content-Type告诉客户端响应的数据的类型,这样浏览器就根据返回数据的类型来进行不同的处理。
    GET:通过url传值,有长度限制。
    POST:通过HTTP报文体。
    数据格式。服务端文件名后跟着“?”,由于客户端可能向服务器端提交多个键值对,键值对之间用“&”进行分割,如果URL中有汉字、特殊符号等,则需要对URL进行编码。

    Request

    通过Form获取POST报文体:

    1 //context.Request.Form["name"]获得通过报文体传输的参数
    2 string name = context.Request.Form["name"];
    3 string age = context.Request.Form["age"];

    通过QueryString获取Get方式中的值:

    1 //context.Request.QueryString获得GET方式中“GET /Test.ashx?id=5 HTTP/1.1”中的
    2 //"id=5"值
    3 string name = context.Request.QueryString["name"];
    4 string age = context.Request.QueryString["age"];

    同时获取POST和Get中的值:(同时对Form和QueryString进行查询)

    1 //context.Request["name"]无论是Get还是Post都能获得
    2  string name = context.Request["name"];//[""]索引器
    3 string age = context.Request["age"];

    服务器获取客户端信息:

    复制代码
     1 //服务器想获得浏览器的某些信息:只要浏览器没提交,那么你就获得不了这些信息。服务器无法得知用户是否装了PS,服务器无法得知用户什么时候开机。
     2             context.Response.Write("------------------------
    ");
     3             for (int i = 0; i < context.Request.Headers.AllKeys.Length; i++)//Request.Headers请求报文头
     4             {
     5                 string key = context.Request.Headers.AllKeys[i];
     6                 string value = context.Request.Headers[key];
     7                 context.Response.Write(key+"="+value+"
    ");
     8             }
     9             context.Response.Write("------------------------
    ");
    10 
    11             context.Response.Write(context.Request.HttpMethod + "
    ");
    12             //context.Response.Write(context.Request.InputStream);//请求报文体的流
    13             context.Response.Write(context.Request.Path + "
    ");
    14             context.Response.Write(context.Request.QueryString + "
    ");
    15             context.Response.Write(context.Request.PhysicalPath + "
    ");//被请求的文件的服务器上的物理路径
    16             context.Response.Write(context.Request.UserAgent + "
    ");
    17             context.Response.Write(context.Request.UserHostAddress + "
    ");//客户端的IP地址
    18             context.Response.Write(context.Request.UrlReferrer + "
    ");
    19             context.Response.Write(String.Join(",",context.Request.UserLanguages) + "
    ");//浏览器支持什么语言
    复制代码

    HttpContext:和本次请求相关对象的一个上下文对象,一般通过它过去其他对象。在HttpHandler的ProcessRequest方法中可以通过方法的context参数获得对象。在其他地方可以通过HttpContext.Current拿到当前请求堆栈中的HttpContext对象。

    public void ProcessRequest(HttpContext context)

    Response

    ContentType;OutputStream输出流;
    End()将当前所有缓冲的输出发送到客户端,停止该页的执行。通过对End()进行try,发现是是抛出了异常。
    复制代码
     1  context.Response.End();
     2  //因为End()抛出了一个ThreadAbortException,所以不会继续向下执行了
     3  //因为异常处理效率低,所以尽可能的不用Response.End();
     4  try
     5  {
     6        context.Response.End();//终止HttpHandler的执行,不再向下执行了
     7  }
     8        catch (Exception ex)
     9  {
    10 
    11  }
    复制代码

    context. Server

    Server是一个HttpServerUtility类型(提供用于处理 Web 请求的 Helper 方法)的对象,不是一个类名。
    MapPath:MapPath("~/a.htm")将虚拟路径(~代表项目根目录)转换为磁盘上的绝对路径,操作项目中的文件使用。
    复制代码
    1 FileInfo fi = new FileInfo(@"E:asp.netcorecodeASPNETCoreWeb1*.jpg");
    2 FileInfo fi = new FileInfo(@"*.jpg");//永远不要用相对路径,容易进坑
    3  string filepath = context.Server.MapPath("~/*.jpg");
    4             //得到文件在服务器磁盘上的绝对路径。~表示网站根目录
    5 FileInfo fi = new FileInfo(filepath);
    6 context.Response.Write(fi.Length);
    复制代码

    HtmlEncode、 HtmlDecode:HTML编码解码。Encode为的是把特殊字符转义显示。

    复制代码
    1 string cscode = "hello List<T> list = new List<T>();";
    2 //HtmlEncode:把<>等特殊字符转换为html中的转义字符
    3 string enCodeCSCode = context.Server.HtmlEncode(cscode);
    4 //context.Response.Write(cscode);
    5 context.Response.Write(enCodeCSCode);
    6 context.Response.Write("</body></html>");
    7 string s = "hello List&lt;T&gt; list = new List&lt;T&gt;();";
    8 string s1 = context.Server.HtmlDecode(s);//HtmlEncode的反过程
    9 context.Response.Write(s1);
    复制代码

    UrlEncode、 UrlDecode:url编码解码。汉字、特殊字符(空格、尖括号)等通过Url传递的时候要编码。

    1 //数据传输前最好采用UrlEncode编码
    2 string s = "hello 世界<>";
    3 string s1 = context.Server.UrlEncode(s);
    4 context.Response.Write(s1);

    文件下载

    导出数据动态生成文本,不会弹出保存提示框。增加报文头: context.Response.AddHeader("Content-Disposition", "attachment;filename="+context.Server.UrlEncode("动态文件.txt"));
    复制代码
     1 context.Response.ContentType = "image/jpeg";
     2 using (Bitmap bmp = new Bitmap(500, 200))//创建一个尺寸为500*500的内存图片
     3 using (Graphics g = Graphics.FromImage(bmp))//得到图片的画布
     4 using (Font font = new Font(FontFamily.GenericSerif, 30))
     5 {
     6         HttpRequest request = context.Request;
     7         g.DrawString("IP:" + request.UserHostAddress, font, Brushes.Red, 0, 0);
     8         g.DrawString("浏览器:" + request.Browser.Browser + request.Browser.Version, font, Brushes.Red, 0, 50);
     9         g.DrawString("操作系统:" + request.Browser.Platform, font, Brushes.Red, 0, 100);
    10         bmp.Save(context.Response.OutputStream, ImageFormat.Jpeg);//图片保存到输出流
    11  }
    12 //增加Content-Disposition是告诉浏览器,这个返回的内容是“附件形式”要给用户保存
    13 //filename是建议的文件名            
    14 context.Response.AddHeader("Content-Disposition", "attachment;filename=" +
    15                 context.Server.UrlEncode("动态文件.txt"));
    复制代码

    文件上传

    如果要进行文件上传,则需要采用method="post",并且要设定enctype="multipart/form-data"。提交报文格式会发生变化。用户上传的文件尽量“不落地”,也就是不保存到本地,可以避免:上传文件把服务器撑爆。

    复制代码
     1 context.Response.ContentType = "text/html";
     2             HttpPostedFile file1 = context.Request.Files["file1"];//上传的文件,可以是多个
     3             HttpPostedFile filehaha = context.Request.Files["filehaha"];
     4             string name = context.Request["name"];
     5             //HttpPostedFile.FileName是文件名,通过查看报文发现,FileName是浏览器提交过去的
     6             if (file1.ContentLength > 1024 * 1024)
     7             {
     8                 context.Response.Write("文件不能超过1MB");
     9                 return;
    10             }
    11 
    12             //为什么根据ContentType判断文件类型不安全。
    13             //因为ContentType是浏览器提交的,是可以造假的,文件内容是病毒,filename是1.exe
    14             //ContentType伪造成了"image/jpeg"。
    15             /*
    16             if(file1.ContentType!="image/jpeg"&&file1.ContentType!="image/gif"
    17                  &&file1.ContentType!="image/png")
    18             {
    19                 context.Response.Write("文件类型不允许");
    20                 return;
    21             }*/
    22             string fileExt = Path.GetExtension(file1.FileName);
    23             if(fileExt!=".jpg"&&fileExt!=".gif"&&fileExt!=".png")
    24             {
    25                 context.Response.Write("文件类型不允许");
    26                 return;
    27             }
    28 
    29 
    30             string localFileName = context.Server.MapPath("~/upload") + "/" + file1.FileName;
    31             file1.SaveAs(localFileName);//把文件保存到服务器上
    32             context.Response.Write(localFileName+"<br/>");
    33             context.Response.Write(name);
    复制代码
  • 相关阅读:
    高德地图 Android编程中 如何设置使 标记 marker 能够被拖拽
    Android编程 高德地图 中如何重写 定位按键 的触发事件 (com.amap.api.maps2d.LocationSource)点击定位后不仅定位在地图中心点上而且可以设置地图的缩放大小和提示
    Android 编程 高德地图 (实现显示地图以及定位功能)
    Android 编程 AMapLocationClientOption 类中的 setMockEnable (高德地图 com.amap.api.location.AMapLocationClientOption 中的类)
    Android 编程 AMapLocationClientOption 类中的 setNeedAddress 方法用处 (高德地图 com.amap.api.location.AMapLocationClientOption 中的类)
    数据挖掘、目标检测中的cnn和cn---卷积网络和卷积神经网络
    mfc学习之gdi---gdi空间
    图像处理之特效---光剑特效
    模式识别之线性回归---最小二乘和线性回归
    matlab 学习之常用函数2
  • 原文地址:https://www.cnblogs.com/liuqiyun/p/9287693.html
Copyright © 2020-2023  润新知