在.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. 服务器数据库搭建流程(CentOs+mysql)

    前言: 服务器上数据库搭建需要知道Linux系统的版本,以前的Ubuntu14.04直接在终端下输入apt-get install (package)便可方便的下载并安装mysql,但是在centOs ...

  2. 查看iis对应w3wp.exe显示的进程ID号(转载)

    管理员身份运行cmd,跳转到C:\Windows\System32\inetsrv目录,然后运行appcmd list wp即可查看

  3. webpack和webpack-dev-server安装配置(遇到各种问题的解决方法)

    跟着Webpack傻瓜式指南(一)这个教程在安装webpack和webpack-dev-server的时候遇到很多问题,查了很多终于一一找到解决办法. 主要参考了这三篇博文: moudule.js:3 ...

  4. 关于报错:AttributeError: module 'turtle' has no attribute 'setup' 问题

    对于我们菜鸟,往往安装软件后,都容易使用默认设置,结果将写的文件保存到了安装目录下. 这样造成了很大得隐患,如果写得文件,名称与安装目录下得系统文件名称重复,就容易出现以上报错. 解决方法:1.将文件 ...

  5. solr 分词词库管理思路

    solr 分词词库管理思路 大概有以下几种思路: 1. 自定义 SolrRequestHandler        由 SolrRequestHandler 来进行对分词器,进行A)词库加载B)动态添 ...

  6. kali linux 忘记root密码重置办法

    有段时间没用kali linux 的,加上最近装的系统有比较多,系统root的密码忘掉了,真是麻烦啊.之前在网上看到的一些方法尝试后没进的去,可能是因为不同的linux 不一样吧. 如果因为忘记密码而 ...

  7. 设置node服务器的端口及运行环境

    一般来说,node服务器中通常会看到这样的代码: ``` app.set('port', process.env.PORT || 3000); if ( process.env.NODE_ENV == ...

  8. javaScript事件(六)事件类型之滚轮事件

    滚轮事件其实就是一个mousewheel事件,这个事件跟踪鼠标滚轮,类似Mac的触屏版. 一.客户区坐标位置 鼠标事件都是在浏览器视口的特定位置上发生的.这个位置信息保存在事件对象的clientX和c ...

  9. (25)IO流之转换流InputStreamReader和OutputStreamWriter

    InputStreamReader:字节到字符的桥梁. OutputStreamWriter:字符到字节的桥梁. 它们有转换作用,而本身又是字符流.所以在构造的时候,需要传入字节流对象进来. 构造函数 ...

  10. 设置iPhone网页固定到桌面上的图标

    <!--IOS Icon--> <link rel="apple-touch-icon-precomposed" href="@Url.Content( ...