【技术随笔】ASHX Handler

最近项目要退役 ASHX,但是我对其并不了解,于是简单看了一下是做什么的。

什么是 ASHX 处理程序

某些ASP.NET是动态的。它们使用 C# 代码或磁盘资源生成。这些文件不需要 Web 窗体。相反,ASHX 泛型处理程序是理想的。它可以从查询字符串返回图像、写入 XML 或任何其他数据。

在框架中使用 ASHX ASP.NET目标

我们在 URL 中使用 ASHX 文件,并动态返回内容。我们将使用查询字符串。最后的 URL 将看起来像这样。

http://www.dotnetperls.com/?file=name

入门

创建 ASHX 文件

打开ASP.NET网站。转到网站菜单并单击第一个菜单项,"添加新项目..."这将显示"添加新项目"对话框。

选择"通用处理程序"项,你会得到一个新文件,其中有一些代码称为处理程序.ashx。

自动生成代码

它定义了 IHttpHandler 接口的两个部分。重要部分是 ProcessRequest(),每当请求 Handler.ashx 文件时,都会调用该请求。

映射

将较旧的 URL 或路径映射到新的 ASHX 文件。对于向后兼容性和搜索引擎优化,您可能希望新处理程序接管站点中的旧 URL。

<system.web>
    <urlMappings enabled="true">
        <add url="~/Default.aspx" mappedUrl="~/Handler.ashx"/>
</urlMappings>

添加示例图像

您可以对涉及图像的 ASHX 文件做什么。在磁盘或 Internet 上查找您最喜爱的图像,并将其添加到您的网站项目中。以我为例,我选择的图像是"Flower1.png"。

修改处理程序.ashx

处理程序有两个部分。在这里,我们修改进程请求方法。我们可以更改文件的内容类型和响应内容。使用图像 ContentType 和文件名修改 Handler.ashx 与以下内容类似。

<%@ WebHandler Language="C#" Class="Handler" %>

using System;
using System.Web;

public class Handler : IHttpHandler {

    public void ProcessRequest (HttpContext context) {
        // Comment out these lines first:
        // context.Response.ContentType = "text/plain";
        // context.Response.Write("Hello World");

        context.Response.ContentType = "image/png";
        context.Response.WriteFile("~/Flower1.png");
    }

    public bool IsReusable {
        get {
            return false;
        }
    }
}

测试处理程序

在这里,我们在本地计算机上测试新的配置和 ASHX 文件。现在单击绿色箭头在开发服务器上运行您的网站。您应该在浏览器中看到图像。这是处理程序的结果。

添加功能

到目前为止,这里的例子相对来说毫无用处。它所做就是允许我们通过ASHX处理程序管道图像。您可以向 C# 语言的处理程序添加任何功能(日志记录代码或引用者逻辑)。

此外,开发人员通常需要在请求上使用 QueryString 集合。您可以在处理程序中使用请求.查询字符串,就像在任何 ASPX Web 窗体页面上一样。代码是相同的。

<%@ WebHandler Language="C#" Class="Handler" %>

using System;
using System.Web;

public class Handler : IHttpHandler {

    public void ProcessRequest (HttpContext context) {

        HttpResponse r = context.Response;
        r.ContentType = "image/png";
        //
        // Write the requested image
        //
        string file = context.Request.QueryString["file"];
        if (file == "logo")
        {
            r.WriteFile("Logo1.png");
        }
        else
        {
            r.WriteFile("Flower1.png");
        }
    }

    public bool IsReusable {
        get {
            return false;
        }
    }
}

上述代码接收请求,然后根据 QueryString 集合值返回不同的文件。它将从两个查询字符串返回两个图像之一。将显示它返回的字符串。

性能

使用 ASHX 文件是否有任何性能优势或更改?这些文件不太复杂,它们不涉及尽可能多的事件。它们更精简,涉及的代码更少,这是一个优势。

总结

我们在一个用户网站中使用了 ASHX ASP.NET处理程序。这可以填补许多不同的重要网站功能。我们将 urlMappings 与自定义处理程序上的查询字符串相结合,以极大地简化和简化端到端网站代码。

参考

https://www.dotnetperls.com/ashx

posted @ 2020-10-17 20:16  YanyuWu  阅读(274)  评论(0编辑  收藏  举报