asp.net ashx 学习总结

ashx

一般处理程序(HttpHandler)是·NET众多web组件的一种,ashx是其扩展名。一个httpHandler接受并处理一个http请求
,类比于Java中的servlet。类比于在Java中需要继承HttpServlet类。在net中需要实现IHttpHandler接口,这个接口有一
个IsReusable成员,一个待实现的方法ProcessRequest(HttpContextctx) 。程序在processRequest方法中处理接受到的
Http请求。成员IsReusable指定此IhttpHandler的实例是否可以被用来处理多个请求。

.ashx程序适合产生供浏览器处理的、不需要回发处理的数据格式,例如用于生成动态图片、动态文本等内容。

实例
一个httpHandler的实例:
<% @ webhandler language="C#" class="AverageHandler" %>
using System;
using System.Web;
public class AverageHandler : IHttpHandler
{
//IsReusable成员,指定此IhttpHnadler的实例是否可以被用来处理多个请求。
public bool IsReusable{ get { return true; } }
//在processRequest方法中处理http请求
public void ProcessRequest1(HttpContext ctx)
{
ctx.Response.Write("hello");
}
}
在浏览器中请求此程序,将会打印hello。

访问Session
让自己的ashx类显式的实现一个接口 IReadOnlySessionState,示例如下:
<% @ webhandler language="C#" class="DownloadHandler" %>
public class DownloadHandler : IHttpHandler, IReadOnlySessionState {
public bool IsReusable { get { return true; }}
public void ProcessRequest2(HttpContext ctx)
{
//在上下文中访问session
//ctx.Session["fred"]);
}
}
如果要读写Session的值,那么只要实现 IRequiresSessionState 接口就即可,这两个接口没有待实现的方法。

解决办法
检查IIS主目录->应用程序设置->配置中,有没有.ashx的后缀;
如果没有,点击添加->C:/WINDOWS/Microsoft.NET/Framework/V2.0.50727/aspnet_isapi.dll;
扩展名填入:.ashx
保存即可解决。

========


C# ashx与html的联合使用

https://www.cnblogs.com/chenyucong/p/5777515.html

本文将介绍ashx和html的联合使用方法,尽管目前流行mvc,但handler一般处理程序还是ASP.NET的基础知识,结合html页
面,做出来的网页绝对比WebForm的简洁和效率高。
 

首先,概要说明一下:

html是过去非常老的一种网页格式,属于静态网页,要想在html上呈现SQL Server上的数据,只能依靠ashx了。

大概的方法是,利用html作为模板,使用ashx读取数据库,替换html中的部分内容,最终显示已替换的html内容。

先给个效果图:

下面开始上代码:

首先做用visual studio,新建一个项目,项目下再新建有footer.htm,header.htm,Index.ashx,Index.htm

另外我已做了一个简单的选取表格信息,显示在input标签中的功能,所以我也用到了jquery.min.js

(屏蔽部分请忽略,是我做的另一个静态页面,与本例无关)

1、首先看的是Index.htm的静态网页代码:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-
transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>首页</title>
    <style type="text/css">
        body
        {
            width: 1000px;
        }
        table
        {
            width: 300px;
            text-align: center;
        }
        table th
        {
            text-align: center;
        }
        button
        {
            background-color: Transparent;
        }
    </style>

    <script src="jquery-1.8.2.min.js" type="text/javascript"></script>

    <script>
    function select(obj){
        var $btn=$(obj);
        $("#col1").val($btn.parent().prev().prev().html());
        $("#col2").val($btn.parent().prev().html());
    }
    </script>

</head>
<body>
    $header
    <table class="table table-hover" border="1" cellpadding="0px" cellspacing="0px">
        <tr>
            <th>
                col1
            </th>
            <th>
                col2
            </th>
            <th>
                col3
            </th>
        </tr>
        $content
    </table>
    <br />
    <input id="col1" type="text" />
    <input id="col2" type="text" />
    $footer
</body>
</html>

上图中,第5行至23行<style>是简单样式,

第27行至33行<script>是javascript代码,用于把table中选中的内容填入到input中,
第37行$header和第55行$footer是页头和页尾的标记,后续会使用另外2个html网页替换之,

中间的table创建了3个列头,分别是col1,col2,col3,$content是table的主体部分,后续会在Index.ashx中替换之。
 
2、接着是header.htm:

<h2>
    Title
</h2>

footer.htm:

<hr />
CopyRight &copy; XXX

非常的简单,就是标题和版权信息。

3、最后是Index.ashx:

using System;
using System.Collections;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
using System.IO;

namespace AshxTest
{

    /// <summary>
    /// $codebehindclassname$ 的摘要说明
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class Index : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            //定义最终响应的文本内容的显示方式,这里使用html,所以是"text/html"
            context.Response.ContentType = "text/html";

            //分别把Index.htm,header.htm,footer.htm中的文本内容赋值给3个string变量,是完整的文本内容
            //AppDomain.CurrentDomain.BaseDirectory则是指项目的根目录,由于本例的网页都放在根目录下,没有文
件夹
            string html = File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + "Index.htm");
            string header = File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + "header.htm");
            string footer = File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + "footer.htm");

            //定义table主体内容的string变量为content
            string content = "";
            //简单的for循环10次,把i与abc组合,填入到table的tr td标签中
            for (int i = 1; i < 10; i++)
            {
                content += string.Format("<tr><td>{0}</td><td>{1}</td><td><button value='select'
οnclick='select(this);'>选择</button></td></tr>", "a" + i, "b" + i);
            }

            //以Index.htm的文本内容为基础,根据标记$header,$content,$footer分别替换上面的3个变量
            html = html.Replace("$header", header).Replace("$content", content).Replace("$footer", footer);

            //最终得到的html是完整的html前端代码,通过context.Response.Write输出到浏览器中
            context.Response.Write(html);
        }

        public bool IsReusable
        {

            get
            {
                return false;
            }
        }
    }
}

注释都已经加上了,下面看一下运行的效果。

调试Index.htm:

打开后,只有模板的内容:

此时,修改地址栏的后缀名,改为Index.ashx,就会显示本文开篇时的效果图了。

(图中点击了a8、b8行末端的“选择”按钮,在下方的input标签中显示"a8"和"b8")
 
结语:

这种制作网页的方法是最原生态的,是编程人员必须掌握的。

本文只是介绍一个简单的案例,实际上,在ashx中,可以编写平常我们写的C#代码(包括SQL的操作),在html中也能编写
javascript,也能使用css样式,结合form提交和页面的跳转,可以完成大部分的网页功能,本人还没有学会mvc,所以只
能介绍这种方法了,欢迎各位交流。

========

ashx一般处理程序文件用处

http://www.cnblogs.com/zfanlong1314/p/3501043.html

今天逛博客园,无意发现一篇好文章,关于ashx文件的使用。

文章一:向服务器发送josn字符串,服务器端解析

转载:http://www.cnblogs.com/yzenet/p/3470388.html

    <script type="text/javascript">
        $(function () {
            $("#btnsave").click(function () {


                var json = { "age": 12, "address": "hk",
                    "ship": [ { "custID": "sz", "cpname": "bookstrf" },{ "custID": "fkff", "cpname":
"kfg"}]
                };
              
                $.ajax({

                    type: "post",
                    url: "Handler/test.ashx",
                    datatype: "json",
                    data: { name: JSON.stringify(json) },
                    async: true,
                    success: function (data) {
                        alert(data);

                    }
                });
            });

        });
    </script>

public class test : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
          
            string ss = context.Request["name"];

            var serialize = new JavaScriptSerializer();
            var t = serialize.Deserialize<Model>(ss);

        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }

        class Model
        {
            public int age {get; set;}
            public string address{get; set;}
            public List<Ship> ship{get; set;}
        }
        class Ship
        {
            public string custID{get; set;}
            public string cpname { get; set; }
        }
    }

//得到数据对象:

请求URL:http://localhost:3043/Handler1.ashx?name=HelloWorld!

文章二:如何读取二进制图片-.ashx一般处理程序 --1 

转载:http://www.cnblogs.com/travelcai/archive/2007/09/25/904767.html

总结:看了上面文章一和文章二;可以将两者结合起来。

如果是显示多个不同图片时候,是否可以将

 <asp:Image ID="Image1" runat="server"  ImageUrl="~/ImageHandler.ashx"/></div>

进行改造:

 <asp:Image ID="Image1" runat="server"  ImageUrl="~/ImageHandler.ashx/?pic=U1513.jpg"/></div>

ashx一般程序代码:
 
  public void ProcessRequest (HttpContext context)
    {
        //获取虚拟目录的物理路径。
        string path = context.Server.MapPath("");
         
    <strong>    //获取图片文件名
        string picFileName = context.Request["pic"];
</strong>       
        //获取图片文件的二进制数据。
        byte[] datas = System.IO.File.ReadAllBytes(path + "\\" + picFileName);
       //将二进制数据写入到输出流中。
        context.Response.OutputStream.Write(datas, 0, datas.Length);
    }
  继续扩展一下思路:如果是读取员工信息表,显示员工头像呢?是否只需要传递EmpID就行呢? 。。。 。。。 。答案
是可以的!!!
========

C# 一般处理程序 ashx文件

 

https://blog.csdn.net/life_is_crazy/article/details/83067950

aspx:Web窗体设计页面。Web窗体页由两部分组成:视觉元素(html、服务器控件和静态文本)和该页的编程逻辑(VS中的
设计视图和代码视图可分别看到它们对应得文件)。VS将这两个组成部分分别存储在一个单独的文件中。视觉元素在.aspx
文件中创建

ashx:.ashx文件是主要用来写web handler的。使用.ashx 可以让你专注于编程而不用管相关的web技术。我们熟知的.aspx
是要做html控件树解析的,.aspx包含的所有html实际上是一个类,所有的html都是类里面的成员,这个过程在.ashx是不
需要的。ashx必须包含IsReusable属性(这个属性代表是否可复用,通常为true),而如果要在ashx文件用使用Session必
须实现IRequiresSessionState接口.

<%@ WebHandler Language="C#" Class="StockHandler" %>
 
using System;
using System.Web;
using System.Data;
using BLL;
using Comm.Json;
 
public class StockHandler : IHttpHandler
{
    DataSet ds = new DataSet();
    Mes_ProductBLL mes_ProductBLL = new Mes_ProductBLL();
    Mes_MaterialBLL mes_MaterialBLL = new Mes_MaterialBLL();
    JSONhelper json = new JSONhelper();
    public void ProcessRequest(HttpContext context)
    {
        string output = "";
        string action = context.Request["action"].ToString(); 
        switch (action)
        {
            case "GetProductJson":
                DataTable pdt = getProductData(context);
                string str1 = json.DataTableToJsonWithStringBuilder(pdt);
                output = "{\"total\":" + pdt.Rows.Count + ",\"rows\":" + str1 + "}";
                break;
            case "GetMaterialJson":
                DataTable mdt = getMaterialData(context);
                string str2 = json.DataTableToJsonWithStringBuilder(mdt);
                output = "{\"total\":" + mdt.Rows.Count + ",\"rows\":" + str2 + "}";
                break;
 
            default:
                break;
        }
 
        context.Response.ContentType = "text/plain";
        context.Response.Write(output);
    }
    /// <summary>
    /// 获取产品数据的放法
    /// </summary>
    /// <param name="context"></param>
    /// <returns></returns>
    public DataTable getProductData(HttpContext context)
    {
        DataSet ds = new DataSet();
 
        if (context.Request["SerchVale"] != null && !string.IsNullOrEmpty(context.Request
["SerchVale"].ToString()))
        {
            ds = mes_ProductBLL.GetList(" product_name like '%" + context.Request["SerchVale"].ToString() +
"%'");
        }
        else
        {
            ds = mes_ProductBLL.GetList("");
        }
        return ds.Tables[0];
    }
    /// <summary>
    /// 获取原材料数据的方法
    /// </summary>
    /// <param name="context"></param>
    /// <returns></returns>
    public DataTable getMaterialData(HttpContext context)
    {
        DataSet ds = new DataSet();
 
        if (context.Request["SerchVale"] != null && !string.IsNullOrEmpty(context.Request
["SerchVale"].ToString()))
        {
            ds = mes_MaterialBLL.GetList(" material_name like '%" + context.Request["SerchVale"].ToString()
+ "%'");
        }
        else
        {
            ds = mes_MaterialBLL.GetList("");
        }
        return ds.Tables[0];
    }
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
 
}
ashx特别适合于生成动态图片,生成动态文本(纯文本,json,xml,javascript等即可)等。 
ashx文件有个缺点:它处理控件的回发事件非常麻烦。处理数据的回发,通常都需要一些.aspx页的功能,只有自己手动处
理这些功能(还不如直接建一个aspx文件来处理)。所以,一般使用.ashx输出一些不需要回发处理的项目即可。 
========


利用ashx搭建简易接口

https://blog.csdn.net/ZYD45/article/details/79939475

创建接口的方式有很多,像是Web api,nodejs等等

今天,主要介绍,利用ashx的方式,来搭建一个简易的api

首先,利用VS编辑器,创建一个空的web应用程序

生成的项目文件

为此程序,添加一个新项,选择“一般处理程序”,可以看到文件后缀为.ashx

(生成时文件名自定义为APITest)

若是生成后,重命名,不仅只改文件的名字,还要查看标记,更改标记里的信息

然后我们选择“启动”,

在生成的localhost网站的url里,增添“/ashx文件名.ashx",就可以看到如下信息

要是想返回json文件,修改下 context.Response.ContentType

然后,返回的信息要组装成json字符串,

当然.Net也提供了一些转json的方法,可以自行百度下

context.Response.ContentType = "application/json";

这时候,再去访问,就可以在浏览器的Network中,看到返回的是json对象

要是想解析get方法方法传过来的参数

string method = context.Request.QueryString["method"];//context.Request.QueryString["Get参数名"]
这时候 method得到的就是“Login”这个值,

要是解析POST方法访问的参数,用context.Request.Form["POST参数名"]

For Example

前端用,ajax访问

$.ajax({
 url:'localhost:4883/APITest.ashx?method=Login',
  type:"POST",
  dataType: "json",
   data:{password:'123',userID:'Admin'},
   success:function(data){
     console.log(data);//返回的json数据
  },
  error:function(err){
  console.log(err.responseText);//查看错误信息
})
ashx想要得到password 和userID就用

string userID=context.Request.Form["userID"];//Admin
string password=context.Request.Form["password";];//123
========

ASHX入门教程


https://www.cnblogs.com/znsongshu/p/6621827.html

新建web应用程序  其中添加的ashx包含ashx.CS
普通的web网站只包含ashx
 
新建webapplication应用

新建SampleHandler

public class SampleHandler : IHttpHandler
   {
       public void ProcessRequest(HttpContext context)
       {
           context.Response.ContentType = "text/plain";
           context.Response.Write("Hello World22222");
       }
 
       public bool IsReusable
       {
           get
           {
               return false;
           }
       }
   }
添加generichandler

修改handler1

<%@ WebHandler Language="C#" CodeBehind="Handler1.ashx.cs"
Class="WebApplication2.HandlerSample.SampleHandler" %>
以上配置完成后就可以通过“/HandlerSample/Handler1.ashx”访问了

以下介绍通过更改webconfig配置handler访问

配置webconfig

<system.webServer>
   <defaultDocument>  配置默认启动页
     <files>
       <add value="Products.aspx" />
     </files>
   </defaultDocument>
      <handlers>
        <add name="SampleHandler" verb="*" path="handlertest"
type="WebApplication2.HandlerSample.SampleHandler"/>
      </handlers>
    </system.webServer> 

浏览器输入***/handlertest就可以直接访问了

以上两种访问方式都可以实现对handler的访问

总结:只要类实现了IHttpHandler接口,就是一个handler,便可以通过配置ashx或webconfig访问这个handler
 
发布web application

右键你的主启动项目(一个解决方案多个项目的情况),点击【发布】

 配置文件:配置文件创建,可以在网上下载,可以自己命名后创建,也可以对已创建的配置文件进行管理(操作比较简单
这里不做说明)。

 配置文件:命名配置文件

   连接:连接设置,选择(File System,即文件系统)

 连接:发布到的位置选择,一:到本地文件夹

   连接:发布到的位置选择,二:到IIS

 设置:选择Release(发布用),Debug(调试用)

预览:

发布完成后就可以添加到iis当中访问web application了

访问站点会出现以下错误

解决方法,

到站点目录的属性,安全标签,添加用户(Everyone),并给修改权限:

========

IIS添加对ashx文件的支持

http://www.cnblogs.com/szytwo/archive/2012/09/04/2670493.html

第一步:每个网站都有个“处理程序映射”,用于添加对各种文件的处理程序

第二步:进入“处理程序映射",可以看到对各种文件的处理程序列表,其中就有对ashx文件的处理

第三步:对应网站的NET版本进行添加对ashx文件的处理,注意:NET是32位还是64位

1、NET4.0环境32位的添加方法,处理程序路径:%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll

2、NET4.0环境64位的添加方法,处理程序路径:%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll
========
 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值