Owin学习笔记(二) 中间件开发
Owin中也有类似于ASP.NET的管道,以前在做ASP.NET项目的时候,可以制作很多不同功能HttpHandler或者HttpModule并注册在Web.config中重复使用。在Owin的管道中,我们可以注册中间件(Middleware)来实现相似的功能。
所有的Owin中间件需要继承OwinMiddleware这个抽象类。
public abstract class OwinMiddleware
{
//构造函数,定义了下一个需要运行的中间件
protected OwinMiddleware(OwinMiddleware next);
//下一个需要运行的中间件
protected OwinMiddleware Next { get; set; }
//中间件的执行方法
public abstract Task Invoke(IOwinContext context);
}
当一个请求发送到Owin服务器之后,Owin服务器会自动获取Request中信息并转换成一个IOwinContext对象,然后依次运行定义在Owin管道中的中间件的Invoke方法。在每个中间件的Invoke方法中,开发人员都可以获取到请求的上下文,并且做出不同的Response。
这里需要注意管道中的中间件是有顺序的,他的顺序就是你在Owin启动类Startup中的注册顺序。每个中间件运行完毕之后,都可以指定是否继续运行后续的中间件。在Invoke方法中可以显示调用Next.Invoke(context)来表明需要继续运行后续的中间件。
下面我们做一个简单的PNG图片水印中间件。
创建项目
首先我们创建一个空的命令行工程PNGWatermark,并依次引入一下Nuget Library
Install-Package Microsoft.Owin.Host //使用Owin Host托管
Install-Package Microsoft.Owin.StaticFiles //静态文件中间件
Install-Package Microsoft.Owin.Host.HttpListener //使用HttpListener作为Owin服务器
创建水印中间件
添加一个新类PngWatermarkMiddleware, 其中的AddTextToImg方法是我从网上随便Copy的,这里的主要代码在Invoke方法中。因为Owin中不能使用ASP.NET的Server.MapPath方法,所以这里需要借助PhysicalFileSystem类,来吧url转换成对应的服务器文件路径。在这个方法最后我没有写Next.Invoke(context), 是因为我认为加上水印之后,后续的中间件已经不需要运行了。
public class PngWatermarkMiddleware : OwinMiddleware
{
public PngWatermarkMiddleware(OwinMiddleware next) : base(next)
{
}
public override async Task Invoke(IOwinContext context)
{
//获取网站根目录
PhysicalFileSystem pfs = new PhysicalFileSystem(string.Empty);
IFileInfo info = null;
//转换url为绝对文件路径, 并检查文件是否存在
var isFile = pfs.TryGetFileInfo(context.Request.Uri.LocalPath, out info);
if (isFile && info.Name.EndsWith(".png"))
{
//如果是文件,就读取图片内容,加水印
Image image = Image.FromFile(info.PhysicalPath);
var imageByteAfterAddingWatermark = AddTextToImg(image, "Author: Lamond");
context.Response.ContentType = "application/x-png";
context.Response.StatusCode = (int)HttpStatusCode.OK;
await context.Response.WriteAsync(imageByteAfterAddingWatermark);
}
}
public static byte[] AddTextToImg(Image image, string text)
{
Bitmap bitmap = new Bitmap(image, image.Width, image.Height);
Graphics g = Graphics.FromImage(bitmap);
float fontSize = 12.0f; //字体大小
float textWidth = text.Length * fontSize; //文本的长度
//下面定义一个矩形区域,以后在这个矩形里画上白底黑字
float rectX = 0;
float rectY = 0;
float rectWidth = text.Length * (fontSize + 8);
float rectHeight = fontSize + 8;
//声明矩形域
RectangleF textArea = new RectangleF(rectX, rectY, rectWidth, rectHeight);
//定义字体
Font font = new Font("宋体", fontSize);
//白笔刷,画文字用
Brush whiteBrush = new SolidBrush(Color.White);
//黑笔刷,画背景用
Brush blackBrush = new SolidBrush(Color.Black);
g.FillRectangle(blackBrush, rectX, rectY, rectWidth, rectHeight);
g.DrawString(text, font, whiteBrush, textArea);
MemoryStream ms = new MemoryStream();
bitmap.Save(ms, ImageFormat.Png);
return ms.ToArray();
}
}
注入水印中间件
Owin中间件需要在Owin启动类的Configuration中注册,所以这里我们需要加一个Owin Startup类,代码如下
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Use<PngWatermarkMiddleware>();
}
}
以OwinHost方式启动项目
在Program.cs中加入以下代码,启动Owin服务器
class Program
{
static void Main(string[] args)
{
var url = "http://localhost:1234";
using (WebApp.Start<Startup>(url))
{
Console.WriteLine("Server Started");
}
Console.Read();
}
}
最终运行效果
下面我们将一个logo.png放置到当前项目的bin/debug目录中

然后启动项目,运行效果如下

打开浏览器,输入http://localhost:1234/logo.png
浏览器会自动下载一个logo.png, 打开之后,其内容如下,水印已经成功加上了

Owin学习笔记(二) 中间件开发的更多相关文章
- Struts2学习笔记二:开发流程
一:创建项目,添加依赖包 二:在web.xml配置核心控制器 <filter> <filter-name>struts2</filter-name> <fil ...
- Java学习笔记二:Java开发工具Eclipse的安装与使用
Java开发工具Eclipse的安装与使用 正如office一样我们在开发java语言过程中同样需要依款不错的开发工具,目前市场上的IDE很多,这里只演示Eclipse的安装: 一:下载软件: 1.下 ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules
amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...
- amazeui学习笔记二(进阶开发4)--JavaScript规范Rules
amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...
- amazeui学习笔记二(进阶开发3)--HTML/CSS规范Rules
amazeui学习笔记二(进阶开发3)--HTML/CSS规范Rules 一.总结 1.am:以 am 为命名空间 2.模块状态: {命名空间}-{模块名}-{状态描述} 3.子模块: {命名空间}- ...
- amazeui学习笔记二(进阶开发2)--Web组件简介Web Component
amazeui学习笔记二(进阶开发2)--Web组件简介Web Component 一.总结 1.amaze ui:amaze ui是一个web 组件, 由模板(hbs).样式(LESS).交互(JS ...
- amazeui学习笔记二(进阶开发1)--项目结构structure
amazeui学习笔记二(进阶开发1)--项目结构structure 一.总结 1.项目结构:是说的amazeui在github上面的项目结构,二次开发amazeui用 二.项目结构structure ...
- Qlik Sense学习笔记之Mashup开发(二)
date: 2019-01-26 11:28:07 updated: 2019-01-26 11:28:07 Qlik Sense学习笔记之Mashup开发(二) 1.Mobile SPA UI Fr ...
- MongoDB学习笔记二- Mongoose
MongoDB学习笔记二 Mongoose Mongoose 简介 之前我们都是通过shell来完成对数据库的各种操作, 在开发中大部分时候我们都需要通过程序来完成对数据库的操作 而Mongoose就 ...
随机推荐
- 实验二《Java面向对象程序设计》实验报告
一.实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 二.实验步骤 (一)单元测试 1.三种代码:伪代码.测 ...
- pycharm的list的应用
li = [11,22,22,33,44] v = li.count(22) print (v) #输出结果2 #计算元素的次数 count的应用 li = [11,22,33,22,44] li.e ...
- Tomcat手动部署Web项目详细步骤
阅读须知:文章基于Tomcat8,其它版本若有差异,请自行辨别.本文为博主原创文章,转载请附原文链接. 不借助任何IDE,这里介绍在Tomcat中手动部署web项目的三种方式: 1.部署解包的weba ...
- 1.SSM整合_单表的增删改查
目标:增删改查 环境:Maven+Eclipse+Tomcat7+JDK7 思维导图: 表结构 目录结构 依赖 <dependencies> <dependency> < ...
- openCV 简单实现身高测量(未考虑相机标定,windows)
(一) OpenCV3.1.0+VS2015开发环境配置 下载OpenCV安装包(笔者下载3.1.0版本) 环境变量配置(opencv安装路径\build\x64\vc14\bin,注意的是x64文件 ...
- 你不知道的JS之作用域和闭包(一)什么是作用域?
原文:你不知道的js系列 什么是作用域(Scope)? 作用域 是这样一组规则——它定义了如何存放变量,以及程序如何找到之前定义的变量. 编译器原理 JavaScript 通常被归类为动态语言或者解释 ...
- python多版本管理工具(pyenv)
在学习和利用python开发的很多情况下,需要多版本的Python并存.此时需要在系统中安装多个Python,但又不能影响系统自带的 Python.pyenv 就是这样一个 Python 版本管理器. ...
- vue学习笔记:在vue项目里面使用引入公共方法
首先新建一个文件夹:commonFunction ,然后在里面建立 一个文件common.js 建立好之后,在main.js里面引入这个公共方法 最后是调用这个公共方法 测试一下,我在公共方法里面写了 ...
- MVC编程模型
MVC 编程模型 MVC 是三个 ASP.NET 开发模型之一. MVC 是用于构建 web 应用程序的一种框架,使用 MVC (Model View Controller) 设计: Model(模型 ...
- php-cgi占用太多cpu资源而导致服务器响应过慢
服务器环境:redhat linux 5.5 , nginx , phpfastcgi 在此环境下,一般php-cgi运行是非常稳定的,但也遇到过php-cgi占用太多cpu资源而导致服务器响应过慢 ...