asp.net core 对HttpContext 的扩展

现在,试图围绕HttpContext.Current构建你的代码真的不是一个好主意,但是我想如果你正在迁移一个企业类型的应用程序,那么很多HttpContext.Current会围绕这个业务逻辑,它可能会提供一些暂时的缓解移植应用程序的条款。另外,在过去我已经写了一些我不一定认为是好主意的事情。

我们现代的HttpContext.Current将依赖于从IHttpContextAccessor解析上下文,并且可能如下所示:



namespace System.Web
{
    public static class HttpContext
    {
        private static IHttpContextAccessor _contextAccessor;


        public static Microsoft.AspNetCore.Http.HttpContext Current => _contextAccessor.HttpContext;


        internal static void Configure(IHttpContextAccessor contextAccessor)
        {
            _contextAccessor = contextAccessor;
        }
    }
}



请注意,我们甚至将它放置在System.Web命名空间中,以便您进行任何潜在的迁移更容易一些。

我们只需要在处理流水线中尽可能早地将代码添加到Configure中,并传入IHttpContextAccessor这可以通过两种扩展方法来实现:

  public static class StaticHttpContextExtensions
    {
        public static void AddHttpContextAccessor(this IServiceCollection services)
        {
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        }


        public static IApplicationBuilder UseStaticHttpContext(this IApplicationBuilder app)
        {
            var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
            Common.HttpContext.Configure(httpContextAccessor);
            return app;
        }

第一个将启动时ConfigureServices调用,并在DI中注册访问器。我们已经确定,这是默认IHttpContextFactory正确分享其HttpContext实例所必需的

第二个将启动时Configure调用,并且它将确保我们的自定义HttpContext.Current赋予IHttpContextAccessor以使其可以正常工作。

就是这样 这是我的Startup类,为静态HttpContext.Current设置表


    public class Startup
    {
        public void ConfigureServices(IServiceCollectionservices)
        {
            services.AddHttpContextAccessor();
        }
 
        public void Configure(IApplicationBuilderapp)
        {
            app.UseStaticHttpContext();
            app.UseMvc();
        }
    }


例子:

public class MyService
{
    public void DoWork()
    {
        varcontext=HttpContext.Current;
        // continue with context instance
    }
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用以下代码将多个 DataTable 导出到一个 Excel 文件的多个 sheet 中: ```csharp protected void ExportToExcel(List<DataTable> tables, string fileName) { // 创建一个新的工作簿 var workbook = new XSSFWorkbook(); // 循环创建每个表格的 sheet for (int i = 0; i < tables.Count; i++) { // 创建一个新的 sheet var sheet = workbook.CreateSheet("Sheet" + (i + 1)); // 填充表头 var headerRow = sheet.CreateRow(0); for (int j = 0; j < tables[i].Columns.Count; j++) { headerRow.CreateCell(j).SetCellValue(tables[i].Columns[j].ColumnName); } // 填充数据到 sheet 中 for (int row = 0; row < tables[i].Rows.Count; row++) { var dataRow = sheet.CreateRow(row + 1); for (int col = 0; col < tables[i].Columns.Count; col++) { dataRow.CreateCell(col).SetCellValue(tables[i].Rows[row][col].ToString()); } } } // 写入到 HttpContext 中 var ms = new MemoryStream(); workbook.Write(ms); HttpContext.Current.Response.Clear(); HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName); HttpContext.Current.Response.BinaryWrite(ms.ToArray()); HttpContext.Current.Response.End(); } ``` 使用方法示例: ```csharp List<DataTable> tables = new List<DataTable>(); tables.Add(GetDataTable1()); tables.Add(GetDataTable2()); ExportToExcel(tables, "test.xlsx"); ``` 其中,`GetDataTable1()` 和 `GetDataTable2()` 分别是获取需要导出的两个 DataTable 的方法,`"test.xlsx"` 是导出的 Excel 文件的文件名。导出的文件会自动下载到客户端计算机。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值