.net core 利用中间件处理常见的网站功能 包括 session、routers、重定向、重写和文件下载
在.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 ,添加方式:
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:
同样需要执行这些操作:
services.AddRouting();
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、重定向、重写和文件下载的更多相关文章
- ASP.NET Core 利用中间件支持跨域请求
方法1: 在Startup的ConfigureServices()中添加services.AddCors()在Startup的Configure()中添加app.UseCors(); 保证其在app. ...
- 一、常见PHP网站安全漏洞
对于PHP的漏洞,目前常见的漏洞有五种.分别是Session文件漏洞.SQL注入漏洞.脚本命令执行漏洞.全局变量漏洞和文件漏洞.这里分别对这些漏洞进行简要的介绍. 1.session文件漏洞 Sess ...
- asp.net core mvc 中间件之路由
asp.net core mvc 中间件之路由 路由中间件 首先看路由中间件的源码 先用httpContext实例化一个路由上下文,然后把中间件接收到的路由添加到路由上下文的路由集合 然后把路由上下文 ...
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...
- 利用wget 抓取 网站网页 包括css背景图片
利用wget 抓取 网站网页 包括css背景图片 wget是一款非常优秀的http/ftp下载工具,它功能强大,而且几乎所有的unix系统上都有.不过用它来dump比较现代的网站会有一个问题:不支持c ...
- ASP.NET Core路由中间件[3]: 终结点(Endpoint)
到目前为止,ASP.NET Core提供了两种不同的路由解决方案.传统的路由系统以IRouter对象为核心,我们姑且将其称为IRouter路由.本章介绍的是最早发布于ASP.NET Core 2.2中 ...
- ASP.NET Core路由中间件[2]: 路由模式
一个Web应用本质上体现为一组终结点的集合.终结点则体现为一个暴露在网络中可供外界采用HTTP协议调用的服务,路由的作用就是建立一个请求URL模式与对应终结点之间的映射关系.借助这个映射关系,客户端可 ...
- ASP.NET Core:中间件
一.什么是中间件 我们都知道,任何的一个web框架都是把http请求封装成一个管道,每一次的请求都是经过管道的一系列操作,最终才会到达我们写的代码中.而中间件就是用于组成应用程序管道来处理请求和响应的 ...
- Apache:如何利用.htaccess文件对PHP网站或文件进行伪静态处理
来源:http://www.ido321.com/1123.html 今天get了一招:利用.htaccess文件对PHP网站或文件进行伪静态处理. 一.检查服务器是否支持伪静态处理: 必 须要空间支 ...
随机推荐
- Struts2框架(8)---Struts2的输入校验
Struts2的输入校验 在我们项目实际开发中在数据校验时,分为两种,一种是前端校验,一种是服务器校验: 客户端校验:主要是通过jsp写js脚本,它的优点很明显,就是输入错误的话提醒比较及时,能够减轻 ...
- yaourt 之 Curl 错误
最近执行 yaourt 更新时总是出现以下错误: curl error: Couldn't connect to server 无法进行更新.把配置中的下载工具更换了成 axel 等其它下载工具,还是 ...
- MySQL+SSM+Ajax上传图片问题
第一次写上传图片的代码,碰到很多问题.昨天做了整整一天,终于在晚上的时候成功了.大声欢呼. 但是,做完之后,还是有很多问题想不通.所以在这里也算是写个笔记,日后忘记了可以回顾,也算请教各路朋友.(^_ ...
- 如果服务器不能把编码格式改成UTF8怎么办?(20161113)
//数组内容的编码格式:utf8 /* 如果服务器不能把编码格式改成UTF8 则在方法里的执行sql语句之前输入下面三段代码就可以使得返回的数组的编码格式为UTF8 $conn->query(' ...
- js动态加载的蒙板弹框
我们访问一些网站时总会遇到这种点击后,背景像被打上一层模板一样,这个是怎么做到的呢? 它是将这个弹框div独立于页面容器wrap,设置position为absolute,将其水平垂直之后都居中,设置弹 ...
- cuda编程学习4——Julia
书上的例子编译会有错误,修改一下行即可. __device__ cuComplex(float a,float b):r(a),i(b){} /* ========================== ...
- iOS开发之视频播放
1.如何播放视频 iOS提供了MPMoviePlayerController.MPMoviePlayerViewController两个类,可以用来轻松播放视频和网络流媒体\网络音频. 提示:网络音频 ...
- MySQL1236错误的恢复
从库出现问题 mysql> show slave status\G; *************************** . row *************************** ...
- python混账的编码问题解决之道
下面的代码作用是修改文件的编码格式.代码很简单,但是也很牛逼(在我看来),这是在segment上找到的解决办法,废话不多说,直接上代码. import codecsdef ReadFile(fileP ...
- Swing入门
厌倦了在控制台使用键盘输入并显示结果的过程?是的,在你现在这台电脑上,已经很少有程序使用这种交互方式.本实验将带你初步进入图形用户界面(GUI)的世界,让你学会如何编写屏幕上那些具有特定大小和位置的窗 ...