前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.net core 利用中间件处理常见的网站功能 包括 session、routers、重定向、重写和文件下载

.net core 利用中间件处理常见的网站功能 包括 session、routers、重定向、重写和文件下载

作者头像
FreeTimeWorker
发布2020-08-31 15:18:01
5490
发布2020-08-31 15:18:01
举报
文章被收录于专栏:C#开发点点滴滴C#开发点点滴滴

在.net core中所有的请求都会被请求中间件所处理,所以我们可以通过在中间件里边添加对应的功能然后在服务中添加注入来实现对应的功能

文件位置:Startup.cs=>Configure方法,请求中间件的代码位置

1.什么是中间件:

中间件是组装成应用程序管道以处理请求和响应的软件。每个组件选择是否将请求传递给流水线中的下一个组件,并且可以在管道中调用下一个组件之前和之后执行某些操作。请求代理用于构建请求管道。请求委托处理每个HTTP请求。

这张图已经说的很明白了,就是请求会被中间件一个接一个的处理完毕,最后才返回给客户

给出一个中间件的范例:

在网站的根目录创建类文件,然后就可以在Startup.cs=>Configure 中用以app.AddLog();的方式来调用自定义添加的中间件

代码语言:javascript
复制
 public static class newclass
    {
        public static IApplicationBuilder AddLog(this IApplicationBuilder app)
        {
            new Common.Log.LogFactory().GetLog("中间件测试").Debug(true,"被执行");
            return app;
        }
        
    }

2.依赖注入

依赖注入(DI)是实现对象与其协作者或依赖关系之间松散耦合的技术。为了执行其操作,类需要的对象不是直接实例化协作者,或使用静态引用,而是以某种方式提供给类。大多数情况下,类将通过它们的构造函数声明它们的依赖关系,允许它们遵循显式依赖原则。这种方法被称为“构造器注入”。

值得注意的是构造器注入的参数必须支持默认值

代码语言:javascript
复制
public CharactersController(ICharacterRepository characterRepository, string title = "Characters")
{
    _characterRepository = characterRepository;
    _title = title;
}

1.session ,添加方式:

1.ConfigureServices中添加:

services.AddSession();//使服务支持Session

2.在Configure中添加

代码语言:javascript
复制
            SessionOptions os=new SessionOptions();
            os.IdleTimeout=new TimeSpan(0,0,15);
            app.UseSession(os);

3.测试

在Controller中添加引用:using Microsoft.AspNetCore.Http;

在控制器中添加:

HttpContext.Session.SetString(Guid.NewGuid().ToString(),Guid.NewGuid().ToString());

执行控制器就可以看到效果。

routers:

同样需要执行这些操作:

1.ConfigureServices中添加: services.AddRouting();

2.Configure中添加

代码语言:javascript
复制
var trackPackageRouteHandler = new RouteHandler(context =>
                {
                    StringBuilder sessionstr= new StringBuilder();
                    sessionstr.Append("当前可用session有:<br/>");
                    foreach(string s in context.Session.Keys)
                    {
                        sessionstr.Append("key:"+s+",value:"+context.Session.GetString(s)+"<br/>");
                    }
                    context.Response.Headers.Add("Content-Type","text/html;charset=UTF8");
                    return context.Response.WriteAsync(sessionstr.ToString());
                });
                var routeBuilder = new RouteBuilder(app, trackPackageRouteHandler);
                routeBuilder.MapRoute(
                    "GetSessoin",
                    "Session");
            var routes = routeBuilder.Build();
            app.UseRouter(routes);

3.执行完第一步session的添加如果成功的话,执行完添加session的控制器,再执行 localhost:5000/session就能看到当前的session值

注:这里的router只是一部分,还包含mvc下的router规则,他们之间的关系是与的关系,也就是说,不管是在mvc中定义的规则,还是这里定义的规则都会执行。

重定向和重写,这里实现一个简单的文件下载功能,符合我的路由规则,就下载对应的文件

1.要实现如上功能需要添加对 Microsoft.AspNetCore.Rewrite的引用添加 --nuget Microsoft.AspNetCore.Rewrite ...

2.在Configure中添加代码

代码语言:javascript
复制
            RewriteOptions options = new RewriteOptions()
            .AddRewrite("^(.*)/(.*)$","xmlOption/Get/$2.$1",true)
            .AddRedirect("^sf/(.*).xml","xml/$1");//$1--bug
            app.UseRewriter(options);

解释一下

代码语言:javascript
复制
AddRewrite("^(.*)/(.*)$","xmlOption/Get/$2.$1",true)
这里的意思就是匹配 任意字符/任意字符 ,满足条件就执行 xmlOption/Get/$2.$1 这个控制器【$1,$2是占位符】,下同
添加下载的控制器
代码语言:javascript
复制
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using System.IO;
using System.Threading.Tasks;

namespace Web.Controllers
{
    public class xmlOptionController : Controller
    {
        public void Get(string id)
        {
            string filename=id;
            id = "sf/" + id;
            if (System.IO.File.Exists(id))
            {
                string filePath = id;//路径
                FileInfo fileInfo = new FileInfo(filePath);
                HttpContext.Response.Clear();
                HttpContext.Response.Headers.Add("Content-Disposition", "attachment;filename=" + filename);
                HttpContext.Response.Headers.Add("Content-Length", fileInfo.Length.ToString());
                HttpContext.Response.Headers.Add("Content-Transfer-Encoding", "binary");
                HttpContext.Response.ContentType = "application/octet-stream";
                Task t =  HttpContext.Response.SendFileAsync(id,0,fileInfo.Length);
                t.Wait();
            }
            else
            {
                HttpContext.Response.Headers.Add("Content-type", "text/html;charset=UTF-8");
                HttpContext.Response.WriteAsync("文件不存在");
            }
        }
    }
}

在添加控制器之前需要将静态文件夹sf添加到项目的静态文件中,同样需要在Configure中添加静态文件夹引用

代码语言:javascript
复制
            StaticFileOptions so=new StaticFileOptions();
            so.FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"sf"));//这里的文件名称是真实的文件名称
            so.RequestPath="/sf";//这里的/sf就是程序中映射的路径
            app.UseStaticFiles(so);

到这步就可以执行对应文件的下载了

文件结构如下:

运行效果图:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-04-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档