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

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

1.什么是中间件:

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

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

给出一个中间件的范例:

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

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

2.依赖注入

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

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

public CharactersController(ICharacterRepository characterRepository, string title = "Characters")
{
_characterRepository = characterRepository;
_title = title;
}

1.session ,添加方式:

1.ConfigureServices中添加:
 
services.AddSession();//使服务支持Session
 
2.在Configure中添加
            SessionOptions os=new SessionOptions();
os.IdleTimeout=new TimeSpan(,,);
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中添加
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中添加代码

            RewriteOptions options = new RewriteOptions()
.AddRewrite("^(.*)/(.*)$","xmlOption/Get/$2.$1",true)
.AddRedirect("^sf/(.*).xml","xml/$1");//$1--bug
app.UseRewriter(options);

解释一下

AddRewrite("^(.*)/(.*)$","xmlOption/Get/$2.$1",true)
这里的意思就是匹配 任意字符/任意字符 ,满足条件就执行 xmlOption/Get/$2.$1 这个控制器【$1,$2是占位符】,下同
添加下载的控制器
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,,fileInfo.Length);
t.Wait();
}
else
{
HttpContext.Response.Headers.Add("Content-type", "text/html;charset=UTF-8");
HttpContext.Response.WriteAsync("文件不存在");
}
}
}
}

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

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

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

文件结构如下:

运行效果图:

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

  1. ASP.NET Core 利用中间件支持跨域请求

    方法1: 在Startup的ConfigureServices()中添加services.AddCors()在Startup的Configure()中添加app.UseCors(); 保证其在app. ...

  2. 一、常见PHP网站安全漏洞

    对于PHP的漏洞,目前常见的漏洞有五种.分别是Session文件漏洞.SQL注入漏洞.脚本命令执行漏洞.全局变量漏洞和文件漏洞.这里分别对这些漏洞进行简要的介绍. 1.session文件漏洞 Sess ...

  3. asp.net core mvc 中间件之路由

    asp.net core mvc 中间件之路由 路由中间件 首先看路由中间件的源码 先用httpContext实例化一个路由上下文,然后把中间件接收到的路由添加到路由上下文的路由集合 然后把路由上下文 ...

  4. 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效

    数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...

  5. 利用wget 抓取 网站网页 包括css背景图片

    利用wget 抓取 网站网页 包括css背景图片 wget是一款非常优秀的http/ftp下载工具,它功能强大,而且几乎所有的unix系统上都有.不过用它来dump比较现代的网站会有一个问题:不支持c ...

  6. ASP.NET Core路由中间件[3]: 终结点(Endpoint)

    到目前为止,ASP.NET Core提供了两种不同的路由解决方案.传统的路由系统以IRouter对象为核心,我们姑且将其称为IRouter路由.本章介绍的是最早发布于ASP.NET Core 2.2中 ...

  7. ASP.NET Core路由中间件[2]: 路由模式

    一个Web应用本质上体现为一组终结点的集合.终结点则体现为一个暴露在网络中可供外界采用HTTP协议调用的服务,路由的作用就是建立一个请求URL模式与对应终结点之间的映射关系.借助这个映射关系,客户端可 ...

  8. ASP.NET Core:中间件

    一.什么是中间件 我们都知道,任何的一个web框架都是把http请求封装成一个管道,每一次的请求都是经过管道的一系列操作,最终才会到达我们写的代码中.而中间件就是用于组成应用程序管道来处理请求和响应的 ...

  9. Apache:如何利用.htaccess文件对PHP网站或文件进行伪静态处理

    来源:http://www.ido321.com/1123.html 今天get了一招:利用.htaccess文件对PHP网站或文件进行伪静态处理. 一.检查服务器是否支持伪静态处理: 必 须要空间支 ...

随机推荐

  1. Cocos2d-x shader学习3: sprite描边(Outline)

    Cocos2d-x 3.x的label使用了freetype字体引擎(http://www.freetype.org/),可以很轻松的实现描边和阴影效果.所以本篇文章只针对于sprite来实现描边效果 ...

  2. mybatis基础,mybatis配置文件核心组件typeHandler元素

    无论是从预处理语句中设置一个值,还是从结果集里取出一个值,都会用类型处理器将获取的值以合适的方式转换成 Java 类型 可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型 实现 o ...

  3. SpringBoot之旅 -- 定时任务两种(Spring Schedule 与 Quartz 整合 )实现

    相关文章 Spring Boot 相关文章目录 前言 最近在项目中使用到定时任务,之前一直都是使用Quartz 来实现,最近看Spring 基础发现其实Spring 提供 Spring Schedul ...

  4. 用php+mysql+ajax+jquery做省市区三级联动

    要求:写一个省市区(或者年月日)的三级联动,实现地区或时间的下拉选择. 实现技术:php ajax 实现:省级下拉变化时市下拉区下拉跟着变化,市级下拉变化时区下拉跟着变化. 使用chinastates ...

  5. H5 内联 SVG

    HTML5 内联 SVG HTML5 画布 HTML5 画布 vs SVG HTML5 支持内联 SVG. 什么是SVG? SVG 指可伸缩矢量图形 (Scalable Vector Graphics ...

  6. 基于定位下拉框或者需要点击link才显示的下拉框,二次定位与多次定位实现的实际效果区别

    还是基于上次那个练习的后续出现的思考,http://www.cnblogs.com/8013-cmf/p/6555790.html 界面: 源码: 写法如下:  继续解释这两种的区别: 1.其实基于定 ...

  7. JavaScript的基本规范

    1.不要在同一行声明多个变量: 2.请使用===/!==来比较true/false或者数值: 3.使用对象字面量替代new Array这种形式: 4.Switch语句必须带有default分支: 5. ...

  8. 本地存储和cookies之间的区别

  9. 关于ORACLE通过file_id与block_id定位数据库对象遇到的问题的一点思考

    在ORACLE中,我们可以通过file_id(file#)与block_id(block#)去定位一个数据库对象(object).例如,我们在10046生成的trace文件中file#=4 block ...

  10. rgba兼容性处理

    根据caniuse(http://caniuse.com/#search=rgba),rgba兼容性为IE9以及以上浏览器. 实例代码: <!doctype html> <html ...