c#一般处理程序(1)---httpcontext

本文深入探讨了ASP.NET中的一般处理程序,讲解了其概念、用途及优势,尤其在处理非HTML请求如RSS、Feed、XML时的高效表现。通过示例代码展示了如何使用一般处理程序下载文件,并解析了HttpContext类的重要性和使用场景。

原文链接:https://blog.youkuaiyun.com/kanglix1an/article/details/17269445

今天我们来说一下一般处理程序,一般处理程序是什么呢? 一般处理程序实际上就是一个处理程序类。那么我们为什么要用?用他有什么优势? 对于ASP.NET网站来说,网站最常见的处理结果就是HTML网页,生成网页的工作通常使用拓展名为ASPX的web窗体来完成。对于处理结果不是HTML的请求,都可以通过一般处理程序完成,例如:RSS、Feed、XML、图片等。一般处理程序是ASP.NET网站中最为简单、高效的处理程序,在处理返回类型不是HTML的请求中有着重要的作用。那么如何使用呢?看一下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
namespace 一般处理程序Demo
{
    /// <summary>
    /// Download 的摘要说明
    /// </summary>
    public class Download : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            //添加一个文件的数据类型
            context.Response.ContentType = "application/octet-stream";
            //将文件进行编码
            string encodeFileName = HttpUtility.UrlEncode("文件.htm");//需要把文件名UrlEncode,因为有中文存在
            //添加一个报文头
            context.Response.AddHeader("Content-Disposition", string.Format("attachment;filename=\"{0}\"", encodeFileName));
            //获得文件的文件名称
            string filepath = context.Server.MapPath("Default.aspx");
            //利用文件流保存
            context.Response.Write(File.ReadAllText(filepath));
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

html页面代码:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
     <title>文件打开与保存</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <a  href="Default.aspx">打开文件</a>
    <a href="Download.ashx">保存文件</a>    
    </div>
    </form>
</body>
</html>

大家可以看到,一般处理程序用起来很简单。那么我们看看一般处理程序中很重要的一个类:HttpContext类。
HttpContext类:封装有关个别HTTP请求的所有HTTP特定的信息,又叫上下文。 看到这个解释,我觉得有些抽象,Http特定信息具体又是什么?看了下备注:

为继承 IHttpModule 和 IHttpHandler 接口的类提供了对当前 HTTP 请求的 HttpContext 对象的引用。该对象提供对请求的内部 Request、Response 和 Server 属性的访问。
1.生命周期:从用户发送请求开始到服务器处理完请求并生成内容返回到客户端为止。针对每个不同用户的请求,服务器都会创建一个新的HttpContext实例直到请求结束,服务器销毁这个实例.
2.HttpContext的作用:处理请求的属性如:request,response,server等。其实我们在开发asp.net页面的时候,可以直接使用request等,那为什么要通过HttpContext类来访问呢?因为request等这些可以在aspx页面的代码中直接使用,但是在IHttpModule或IHttpHandler中就不能直接使用。HttpContext类对Request、Response、Server等进行了封装,保证在整个请求周期内都可以随时随地地调用。
3.HttpContext其它功能:HttpContext还可以处理CacHe,HttpContext.Item等,在其生命周期内可以存储一些临时数据,方便随时使用。当用户发送某个Http请求,我们可以通过HttpContext进行截获,查看里面包含了哪些请求的信息,然后可以进行一系列的操作,比如说切换到其他的页面,这个时候,可以重组请求的数据满足新页面的要求。即:即使不在page页面中,也可以通过HttpContext的Current属性来获取当前的web状态。
到这里对httpcontext类有了一个大致的了解,下面看看httpcontext的属性和方法。 属性和方法的详细使用可以查询MSDN。

附两张表:

在这里插入图片描述
在这里插入图片描述

<think>我们正在处理一个关于使用C#一般处理程序(Generic Handler)导出JSON文件的问题。 一般处理程序(.ashx文件)是ASP.NET中用于处理HTTP请求的一种轻量级方式,特别适合生成动态内容,如JSON、XML等。 步骤: 1. 创建一个一般处理程序(.ashx文件)。 2. 在ProcessRequest方法中设置响应内容类型为"application/json"。 3. 构建一个对象(或集合)来表示要导出的数据。 4. 使用JSON序列化库(如Newtonsoft.Json)将对象序列化为JSON字符串。 5. 将序列化后的JSON字符串写入响应。 注意:在.NET Framework中,我们通常使用Newtonsoft.Json(Json.NET)库来处理JSON序列化。在.NET Core中,可以使用System.Text.Json。 由于问题中没有指定.NET版本,我们假设使用.NET Framework(因为一般处理程序在ASP.NET Web Forms中更常见)。 示例代码: 首先,确保已安装Newtonsoft.Json库。可以通过NuGet安装:Install-Package Newtonsoft.Json 然后,创建一个一般处理程序(例如ExportJson.ashx): ```csharp <%@ WebHandler Language="C#" Class="ExportJson" %> using System; using System.Web; using Newtonsoft.Json; public class ExportJson : IHttpHandler { public void ProcessRequest (HttpContext context) { context.Response.ContentType = "application/json"; // 创建要导出的数据对象,这里用一个匿名对象作为示例 var data = new { Name = "John Doe", Age = 30, Email = "john.doe@example.com" }; // 将对象序列化为JSON string json = JsonConvert.SerializeObject(data); // 写入响应 context.Response.Write(json); } public bool IsReusable { get { return false; } } } ``` 如果需要从数据库或其他数据源获取数据,可以在ProcessRequest方法中编写相应的代码。 另外,如果要导出的数据量较大,可以考虑使用流式写入,但此示例简单,直接使用Response.Write即可。 如果用户需要导出的是数组,也可以创建一个数组对象。 例如: ```csharp var list = new[] { new { Id = 1, ProductName = "Product 1" }, new { Id = 2, ProductName = "Product 2" } }; string json = JsonConvert.SerializeObject(list); ``` 注意:在实际应用中,可能需要处理跨域请求(CORS),可以在响应头中添加相应的CORS头部,例如: context.Response.AppendHeader("Access-Control-Allow-Origin", "*"); 同时,根据需求设置缓存策略等。 相关问题: 1. 如何在ASP.NET Core中返回JSON数据? 2. 如何使用一般处理程序处理POST请求并返回JSON? 3. 如何将数据库中的数据导出为JSON文件? 引用说明:在回答中,我们引用了Newtonsoft.Json库的使用,这是C#中常用的JSON处理库[^1]。</think>### 使用 C# 一般处理程序导出 JSON 文件 在 ASP.NET 中,一般处理程序(.ashx)是轻量级 HTTP 处理程序,适合生成动态内容如 JSON。以下是完整实现步骤: #### 1. 创建一般处理程序 在项目中添加 **Generic Handler** (.ashx) 文件,例如 `ExportJSON.ashx`: ```csharp <%@ WebHandler Language="C#" Class="ExportJSON" %> using System; using System.Web; using System.Collections.Generic; using Newtonsoft.Json; // 需安装 NuGet 包 public class ExportJSON : IHttpHandler { public void ProcessRequest(HttpContext context) { // 设置响应头为 JSON context.Response.ContentType = "application/json"; context.Response.Charset = "utf-8"; // 生成示例数据(替换为实际数据源) var data = new { Timestamp = DateTime.Now, Items = new List<object> { new { Id = 101, Name = "Item A", Price = 19.99 }, new { Id = 102, Name = "Item B", Price = 29.95 } } }; // 序列化为 JSON 并输出 string json = JsonConvert.SerializeObject(data, Formatting.Indented); context.Response.Write(json); } public bool IsReusable => false; // 确保每次请求新实例 } ``` #### 2. 安装依赖库 通过 NuGet 安装 JSON 序列化库: ```bash Install-Package Newtonsoft.Json ``` #### 3. 前端调用示例 通过 JavaScript 请求 JSON 数据: ```javascript fetch('/ExportJSON.ashx') .then(response => response.json()) .then(data => { console.log("导出的JSON数据:", data); // 可选:触发文件下载 const blob = new Blob([JSON.stringify(data)], {type: 'application/json'}); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'exported-data.json'; document.body.appendChild(a); a.click(); }); ``` #### 关键配置说明: 1. **内容类型** `context.Response.ContentType = "application/json"` 确保浏览器识别为 JSON 2. **数据序列化** 使用 `Newtonsoft.Json` 库处理复杂对象序列化,支持嵌套对象和集合 3. **文件下载** 前端通过 Blob API 实现自动下载(可选) 4. **实际数据源** 替换示例数据为数据库查询或业务逻辑: ```csharp // 示例:从数据库获取数据 var dbData = GetDataFromSQL("SELECT * FROM Products"); string json = JsonConvert.SerializeObject(dbData); ``` #### 注意事项: - 处理大型数据时使用流式写入: ```csharp using (var writer = new StreamWriter(context.Response.OutputStream)) { JsonSerializer.Serialize(writer, largeData); } ``` - 添加跨域支持如需: ```csharp context.Response.AppendHeader("Access-Control-Allow-Origin", "*"); ``` - 错误处理: ```csharp try { // 序列化逻辑 } catch (Exception ex) { context.Response.StatusCode = 500; context.Response.Write(JsonConvert.SerializeObject(new { error = ex.Message })); } ``` --- ### 相关问题 1. **如何从数据库直接生成 JSON 文件?** 需结合 ADO.NET 或 Entity Framework 获取数据后序列化[^1] 2. **如何导出大型 JSON 文件避免内存溢出?** 推荐使用 `JsonTextWriter` 流式写入: ```csharp var writer = new JsonTextWriter(context.Response.Output); writer.WriteStartArray(); foreach (var item in largeCollection) { serializer.Serialize(writer, item); } writer.WriteEndArray(); ``` 3. **如何自定义 JSON 日期格式?** 在序列化时配置转换器: ```csharp var settings = new JsonSerializerSettings { DateFormatString = "yyyy-MM-ddTHH:mm:ss" }; JsonConvert.SerializeObject(data, settings); ``` 4. **一般处理程序 vs Web API 有何区别?** 一般处理程序更轻量但功能较少,Web API 提供完整的 RESTful 支持[^2] 5. **如何增加 JSON 导出安全性?** - 添加身份验证:`context.User.Identity.IsAuthenticated` - 限制请求频率 - 过滤敏感字段(通过 `[JsonIgnore]` 属性) [^1]: 数据库交互示例参考 Entity Framework 或 Dapper 文档 [^2]: ASP.NET Core Web API 提供更现代的 JSON 处理方式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值