在.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. laravel初次学习总结及一些细节

    最近学习了laravel,先简单谈谈学习的感受吧 刚开始一周多一点的时间先把laravel的开发文档看了一遍,,感觉刚开始接触时的感觉laravel的目录与thinkphp又不一样,它们的渲染模板的方 ...

  2. 算法模板——splay区间反转 1

    实现的功能:将序列区间反转,并维护 详见BZOJ3223 var i,j,k,l,m,n,head,a1,a2:longint; s1:ansistring; a,b,c,d,fat,lef,rig: ...

  3. js/jQuery中load()、onload()、ready()的区别

    一.两大事件 load事件:指页面包含图片等文件在内的所有元素都加载完毕后执行的事件. ready事件:表示文档结构已加载完成(不包括图片等非文字媒体文件) 浏览器页面渲染的过程 - 寸寸君 - 博客 ...

  4. Visual Studio 2015/2017 与ASP.NET CORE 联合创建具有SPA模式的Angular2模板

    虽然注册博客园很久,但是一直没有什么可写的,真心感觉好尴尬了,这次终于找到了一点可以写,有点小兴奋和小害羞呢. 进入主题,前端SPA模式越来越受到欢迎,Core 也开始被很多企业提上日程,但是因为这个 ...

  5. IIS 部署ASP.Net, WebAPI, Restful API, PUT/DELETE 报405错解决办法, webapi method not allowed 405

    WebDAV 是超文本传输协议 (HTTP) 的一组扩展,为 Internet 上计算机之间的编辑和文件管理提供了标准.利用这个协议用户可以通过Web进行远程的基本文件操作,如拷贝.移动.删除等.在I ...

  6. linux下mysql的大小写是否区分设置

    转:http://blog.csdn.net/qq_29246225/article/details/52293549 一.Linux中MySQL大小写详情:1.数据库名严格区分大小写2.表名严格区分 ...

  7. Maven——快速入门手册(学习记录)

    前言: 前段时间进行了一点maven的入门学习,在这里做个记录,希望能帮到一些正在学习的朋友们.maven版本为3.3.9.希望大家觉得好的点个赞,觉得不好的多提提意见和建议做个交流.这里也贴出我学习 ...

  8. (15)IO流之File

    File类用封装了一个文件夹或者文件的所有属性. File类的构造方法: File(String pathname) 指定文件或者文件夹的路径创建一个File文件 File(File parent, ...

  9. 腾讯QQ会员技术团队:以手机QQ会员H5加速为例,为你揭开sonic技术内幕

    目前移动端越多越多的网页开始H5化,一方面可以减少安装包体积,另一方面也方便运营.但是相对于原生界面而言,H5的慢速问题一定被大家所诟病,针对这个问题,目前手Q存在几种方案,最常见的便是离线包方案,但 ...

  10. 使用arcpy.mapping模块批量出图

      出图是项目里常见的任务,有的项目甚至会要上百张图片,所以批量出土工具很有必要.arcpy.mapping就是ArcGIS里的出图模块,能快速完成一个出图工具. arcpy.mapping模块里常用 ...