ASP.NET5 MVC6 利用Middleware 创建可访问HttpContext 的业务类工厂。(代替HttpContext.Current)
我们的目标是在后台业务处理类中,能够很容易的取得用户信息或者其它HTTP请求相关的信息。
所以,首先我们需要一个存储这些信息的类:
public class RequestData
{
public string UserName { get; set; } public int UserId { get; set; } public UriBuilder Url { get; set; }
}
这个请求信息类,是我们业务工厂类的一个属性:
public class DataControllerFactory
{
public RequestData RequestData { get; set; } = new RequestData(); public T Create<T>() where T : BaseBusiness
{
T dc = Activator.CreateInstance<T>();
dc.RequestData = this.RequestData;
return dc;
}
}
这个工厂类里的BaseBusiness就是所有业务处理类的基类:
public class BaseBusiness
{
public RequestData RequestData { get; set; }
}
也许基类加上 abstract关键字更好些。 接着创建一个用于测试的业务处理类:
public class TestDataController: BaseDataController
{
}
好吧,它是空的,但是做测试够用了。 后台业务层就是上面这些类了。 下面是前台MVC里利用 DI 和 Middleware 实现RequestData的传递和业务类的创建。
首先创建RequestMiddleware
public abstract class AbstractMiddleware
{
protected RequestDelegate Next { get; set; } protected AbstractMiddleware(RequestDelegate next)
{
this.Next = next;
} public abstract Task Invoke(HttpContext context);
} public class RequestMiddleware:AbstractMiddleware
{
public RequestMiddleware(RequestDelegate next) : base(next) { } public async override Task Invoke(HttpContext context)
{
DataControllerFactory factory = context.RequestServices.GetService(typeof(DataControllerFactory)) as DataControllerFactory;
factory.RequestData.UserName = context.User.Identity.Name??"Not Login";
await this.Next.Invoke(context);
}
}
这里用了个基类 AbstractMiddleware, 不过看来作用不大,它不是必须的。
在Startup类里的 Configure 方法中, 注册这个中间件:
app.UseMiddleware<RequestMiddleware>(); //下面的代码也在Configure方法中,用于开启cookie认证功能,这样可以大大的简化登录代码,便于测试或者集成已有的用户管理系统。
//app.UseIdentity();
app.UseCookieAuthentication(options =>
{
options.AuthenticationScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.AutomaticAuthenticate = true;
options.AutomaticChallenge = true;
options.CookieHttpOnly = true;
});
顺便在其 ConfigureServices 方法中添加 业务类工厂 的依赖注入类型
services.AddScoped<DataControllerFactory>();
有可能 这行代码 需要在 services.AddMvc(); 的上面, 总之有时顺序很重要, 但我还没有时间仔细测试这些问题。
下面我们就要测试一下我们能不能取得业务类工厂,并且创建出带有登录请求信息的业务类。
有了上面开启cookie认证的代码,我们在Controller中的登录Action便很简单了:
//这里用了API形式的测试登录方法
public string Login()
{
List<Claim> claims = new List<Claim>();
claims.Add(new Claim("Name", "TestName", ClaimValueTypes.String));
claims.Add(new Claim(ClaimTypes.Name, "TestName", ClaimValueTypes.String));
ClaimsIdentity identity = new ClaimsIdentity(claims, "AuthenticationType", "Name", ClaimTypes.Role);
ClaimsPrincipal principal = new ClaimsPrincipal(identity);
HttpContext.Authentication.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);
return "ok";
}
下面是测试 Factory 和 相关登录请求数据的 Action :
public IActionResult TestLogin()
{
var factor = GetService<DataControllerFactory>();
TestDataController tdc = factor.Create<TestDataController>();
ViewBag.UserName = tdc.RequestData.UserName;
return View();
}
VIEW层调用登录action和测试action的方法很简单,这里就不再写了。
ASP.NET5 MVC6 利用Middleware 创建可访问HttpContext 的业务类工厂。(代替HttpContext.Current)的更多相关文章
- ASP.NET5 MVC6入门教学之一(自己动手)
等待微软开源大动作已经好几年了,终于ASP.NET 5发布了.今天给新手们写一个简单地教程,教你认识一下ASP.NET5 MVC6 1.安装kvm 首先,你需要以管理员权限打开cmd,执行如下的脚本: ...
- ASP.NET5/MVC6 下生成Helppage
https://github.com/domaindrivendev/Ahoy 打开nuget包管理器,搜索Swashbuckle 打开Startup.cs文件在ConfigureServices方法 ...
- visual studio code, asp.net5, mvc6资料汇总
最近在试探性地跟随微软最新发布的一些产品,现列下某些挺好的文章和链接 code.visualstudio.com http://blogs.msdn.com/b/cesardelatorre/arch ...
- 在 ASP.NET 中创建数据访问和业务逻辑层(转)
.NET Framework 4 当在 ASP.NET 中处理数据时,可从使用通用软件模式中受益.其中一种模式是将数据访问代码与控制数据访问或提供其他业务规则的业务逻辑代码分开.在此模式中,这两个层均 ...
- 利用Asp.Net Core的MiddleWare思想处理复杂业务流程
最近利用Asp.Net Core 的MiddleWare思想对公司的古老代码进行重构,在这里把我的设计思路分享出来,希望对大家处理复杂的流程业务能有所帮助. 背景 一个流程初始化接口,接口中根据传入的 ...
- 在ASP.NET MVC3 中利用Jsonp跨域访问
在ASP.NET MVC3 中利用Jsonp跨域访问 在信息系统开发的时,根据相关业务逻辑难免会多系统之间互相登录.一般情况下我们需要在多系统之间使用多个用户名和密码.这样客户就需要在多个系统之间重复 ...
- Visual Studio 2015创建ASP.NET5项目“DNX SDK version 'dnx-clr-win-x86.1.0.0-beta5' 无法安装的错误
使用asp.net5建立web application时遇到DNX SDK版本 “dnx-clr-win-x86.1.0.0-beta5”无法安装的错误 解决办法: 运行cmd: 1.输入: @pow ...
- asp.net/wingtip/创建数据访问层
一. 什么是数据访问层 在wingtip项目中,数据访问层是对以下三者的总称:1. product类等数据相关的实体类(class)2. 数据库(database),对实体类成员的存储3. 上述二者的 ...
- ASP.NET5 中静态文件的各种使用方式
所谓静态文件,包含HTML文件,css文件.图片文件和js文件等,他们是服务器直接读取到客户端的一些资源,在这篇文章中,我们将解释关于ASP.NET5和静态文件的一些内容. 服务端的静态文件 默认情况 ...
随机推荐
- Asp.Net 无刷新文件上传并显示进度条的实现方法及思路
相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦苦来 实现呢?我并不否认”拿来主义“,只是我个人更喜欢凡是求个所以 ...
- asp.net网站底部的版权信息实现代码且可维护
网站底部的版权信息在特殊情况还是比较重要的所以在实现的时候一定要尽可能的做到可维护性,接下来将介绍一些技巧可达到可维护效果,感兴趣的你可不要错过了哈 一个大网站页面很多,如果每个版权信息直接写在下面, ...
- < 转载 > 说说JSON和JSONP
推荐博文---说说JSON和JSONP,也许你会豁然开朗,含jQuery用例 里头说的很详细!
- 【BZOJ3944/4805】Sum/欧拉函数求和 杜教筛
[BZOJ3944]Sum Description Input 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N,代表一组询问 Output 一共T行,每行两个用 ...
- I - Doing Homework again(贪心)
I - Doing Homework again Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & ...
- entropy 压缩信息的熵更加高 实际上英文文本的熵大概只有4.7比特
https://en.wikipedia.org/wiki/Entropy_(information_theory) https://zh.wikipedia.org/wiki/熵(信息论) 熵的概念 ...
- h5-localStorage实现缓存ajax请求数据
使用背景:要实现每次鼠标hover“能力雷达”,则显示能力雷达图(通过ajax请求数据实现雷达图数据显示),所以每次hover都去请求ajax会影响性能,因此这里要用到本地缓存. 实现: 此处是通过传 ...
- Mysql常用优化方案
摘自:http://www.jb51.net/article/18934.htm 1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也 ...
- Redis作者谈Redis应用场景(转)
add by zhj : 这是Redis的作者antirez在他的技术博客中写的一篇文章 英文原文:take-advantage-of-redis-adding-it-to-your-stack 译文 ...
- MySQL复制(二):二进制日志、二进制日志的结构和内容
通常只有即将执行完毕的语句才会写入到二进制日志中.但是一些特殊情况:语句附加的信息或直接代替语句被写入. 二进制日志记录的内容 作用:记录数据库中表的更变,用于复制和PITP(即时恢复) 基于语句SB ...