Nancy之基于Nancy.Owin的小Demo

前面做了基于Nancy.Hosting.Aspnet和Nancy.Hosting.Self的小Demo

今天我们来做个基于Nancy.Owin的小Demo

开始之前我们来说说什么是Owin和Katana

什么是Owin呢?

官网地址:http://owin.org

OWIN在.NET Web Servers与Web Application之间定义了一套标准接口,OWIN的目标是用于解耦Web Server和Web Application。

什么是Katana呢?

官网地址:http://katanaproject.codeplex.com/

一把锐利的武士刀。

比较详细的介绍大家可以看看JustRun的文章:

下一代Asp.net开发规范OWIN(1)—— OWIN产生的背景以及简单介绍

下一代Asp.net开发规范OWIN(2)—— Katana介绍以及使用

介绍这两个不是今天的主题,所以下面就进入我们的正题了

一、新建一个空的asp.net程序

二、通过NuGet添加相关的程序集

Nancy.Owin,今天的主角。添加完这个后会自动添加Nancy

还有一个重要的角色是Microsoft.Owin.Host.SystemWeb,同时会自动添加依赖项:Owin和Microsoft.Owin

这个是通过Visual Studio 的Manage NuGet Packages来添加的,也可以在Package Manager Console输入

  Install-Package Nancy.Owin

  Install-Package Microsoft.Owin.Host.SystemWeb

来完成添加。

三、添加OWIN Startup Class

我们在添加的Startup.cs中的Configuration中添加一下代码,将Nancy交给Owin处理

1     public class Startup
2     {
3         public void Configuration(IAppBuilder app)
4         {
5             app.UseNancy();
6         }
7     }

四、添加Modules文件夹用于存放我们的Modules

在Modules文件夹新建HomeModule.cs

1     public class HomeModule:NancyModule
2     {
3         public HomeModule()
4         {
5             Get["/"] = _ => "OwinDemo by Catcher Wong";
6         }
7     }

这里我们就显示一下文字,后面部署会用之前的MovieDemo来完成。

ok,看看效果!

这个是符合我们预期结果的。

注:1)、由于演示这里用的 Microsoft.Owin.Host.SystemWeb是3.0.1版本的所以不需要做额外的处理,

    如果您的版本是1.x的话,请在web.config中添加如下配置

1 <appSettings>
2     <add key="owin:HandleAllRequests" value="true"/>
3 </appSettings>

    在新版本中简化了我们的操作,可见还是很贴心的 O(∩_∩)O

   2)、如果您需要用到除了Get、Post之外的方法(Put、Head、Delete)还需要在system.webServer节点做相应的修改

1 <system.webServer>
2 <handlers>
3       <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
4       <remove name="OPTIONSVerbHandler" />
5       <remove name="TRACEVerbHandler" />
6       <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
7 </handlers>
8 </system.webServer>

五、多种运行调试方法,任君选择

到这里,我们可以发现,我们运行和调试还是借助的IIS Express。
我们有没有办法不用IIS Express来运行和调试呢?
当然是有的!!!而且不止一种!!下面我们就分别来介绍一下!!

方式一:借助OwinHost.exe

可以参考 Glavs的这篇博客: Owin, Katana and getting started
通过启动外部程序来实现!
在我们项目的属性中的web选项卡中做如下的修改

就修改一下属性即可。

再次运行,会发现启动了一个OwinHost.exe的程序,然后我们打开浏览器去看看

效果是不是一样啊,这就是第一种方式!

方式二:借助TinyFox(Jexus的姐妹)

这里我用的是TinyFox V2.3.2 跨平台通用版

下载地址: TinyFox V2.3.2 跨平台通用版

具体要怎么做呢?读读解压后的ReadMe.txt和看看里面附带的demo也就大概知道个所以然了。

做法跟katana的方式类似,都是通过启动外部程序来实现的。

但是区别还是有的。

我们需要添加一个Adapter.cs(这个我们可以在解压后的TinyFox中的Demo里找到,修改一下namespace即可!)

 1 /**************************************************************************************
 2  *  ===              通过Microsoft.Owin.dll运行Nancy的应用示例                   ===
 3  * ==================================================================================
 4  * 目的:
 5  *   演示如果将 NancyFx 加入到 Microsoft.Owin 的处理环节中,然后利用Nancy建立web应用。
 6  * 使用方法:
 7  *   将编译得到的dll连同Owin.dll、Microsoft.Owin.dll、Nancy.dll、Nancy.Owin.dll等文件
 8  *   一并放置到网站的bin文件夹中
 9  *************************************************************************************/
10
11
12
13 #region <USINGs>
14
15 using System;
16 using System.Collections.Generic;
17 using Microsoft.Owin.Builder;
18 using System.Threading.Tasks;
19
20 #endregion
21
22
23
24 namespace OwinDemo
25 {
26
27     /// <summary>
28     /// 针对Microsoft.Owin的JWS开放接口适配器
29     /// <para>本接口适合兼容Microsoft.Owin规范的应用</para>
30     /// </summary>
31     class Adapter
32     {
33         static Func<IDictionary<string, object>, Task> _owinApp;
34
35         /// <summary>
36         /// 默认构造函数
37         /// </summary>
38         public Adapter()
39         {
40             var builder = new AppBuilder();
41             var startup = new Startup();
42             startup.Configuration(builder);
43             _owinApp = builder.Build();
44
45         }
46
47
48         /// <summary>
49         /// *** JWS所需要的关键函数 ***
50         /// <para>每个请求到来,JWS都会把请求打包成字典,调用这个函数</para>
51         /// </summary>
52         /// <param name="env">新请求的环境字典,具体内容参见OWIN标准</param>
53         /// <returns>返回一个正在运行或已经完成的任务</returns>
54         public Task OwinMain(IDictionary<string, object> env)
55         {
56             //如果为空
57             if (_owinApp == null) return null;
58
59             //将请求交给Microsoft.Owin处理
60             return _owinApp(env);
61         }
62
63
64     } //end class
65
66
67 } //end namespace

做完这步,我们也是需要修改项目属性的web选项卡内容

做完上述工作,看看效果

一样的结果!!

六、部署到Linux下

前面也提到了,这里我们部署的是用之前的MovieDemo,这里是对其进行了修改,使其满足我们今天的主题。

这次的部署是结合TinyFox这只小狐狸来完成的。由于篇幅有点长,所以修改的代码不在这里展示,稍后会上传到GitHub

这里列出项目结构和进行一些说明:

会发现比上面演示的案例多了几个类:RazorConfig.cs和SiteRootPath.cs

其中

RazorConfig.cs是Razor的配置,因为我们这个Demo用到了Razor这个视图引擎,如果没用到可以不用这个。

SiteRootPath.cs是提供网站物理路径的类

这两个类我们都是能在TinyFox的Demo里面找到的!

现在我们将发布后的内容上传到 /var/www/owinnancy

在 /var/www/ 下新建一个文件夹owinnancy : mkdir owinnancy

然后进入 tinyfox的目录 cd /usr/tinyfox-2.3

执行./fox.sh -root ar/www/owinnancy -p 8181

已经启动成功了,下面就是访问看看OK否。打开浏览器访问这个demo试试。顺便放上几张图看看效果。

几点必要的说明
1、宇内大大在ReadMe.txt中是这样描述的(我只截取了部分内容)
  问:网站文件放哪儿?
      答:在TinyFox所在文件夹下的有一个名叫“site”的文件夹,这个文件夹中包括两个子目录,一个是wwwroot,

      用户存放传统的网站文件或静态文件,另一个是approot,用于存放用户的程序集及其相关依赖的dll,当然,

     dll文件也可以存放在wwwroot下的bin文件夹中;

  问:如果我的网站文件夹不在tinyfox默认的位置,怎么设定?

    答:在TinyFox.exe 后边加上一个形如“-root 路径”这样的参数,如:“tinyfox -root d:\mysite\wwwroot”

   由于习惯问题,我是将网站放在 /var/www/下的某个文件夹,所以是采用了自定义路径的形式。


2、次要说明,本来这篇是要在昨天发的,但因有事没能及时发布!再说昨天是科比81分之夜的十周年,所以取8181端口纪念一下。O(∩_∩)O

最后是部署所用的MovieDemo,其实跟之前的没多少差别。

下载地址:

https://github.com/hwqdt/Demos/tree/master/NancyDemoWithOwin/MovieDemoWithOwin

下一篇将会是对 Self Hosing 的一点点补充,敬请期待。

时间: 2024-10-10 00:18:25

Nancy之基于Nancy.Owin的小Demo的相关文章

Nancy之基于Self Hosting的补充小Demo

前面把Hosting Nancy with ASP.NET.Self Hosting Nancy和Hosting Nancy with OWIN 以demo的形式简单描述了一下. 这篇是为Self Hosting Nancy.和Owin 下面的Self Hosting作个补充. 首先是Self Hosting Nancy的补充: 这里主要是介绍一下Topshelf 官网:http://topshelf-project.com/ GitHub地址:https://github.com/Topshe

一个基于ES6+webpack的vue小demo

上一篇文章<一个基于ES5的vue小demo>我们讲了如何用ES5,vue-router做一个小demo,接下来我们来把它变成基于ES6+webpack的demo. 一.环境搭建及代码转换 我们先搭建一下vue 的开发环境,根据我的一篇随笔<Vue开发环境搭建及热更新>,我们一步步搭建开发环境,project名为ES6-demo. 在之前我发表的一篇随笔< 理解最基本的Vue项目>中,说到了在放置组件和入口文件的src文件夹中,main.js文件就是入口文件,App.v

react todoList小demo

基于create-react-app做的小demo 比较简单直接上代码 效果图 import React from 'react' import Input from '../../components/Input/index' import List from '../../components/List/index' class Todo extends React.Component{ constructor(props){ super(props) this.state={ todos:

新手 gulp+ seajs 小demo

首先,不说废话,它的介绍和作者就不在多说了,网上一百度一大堆: 我在这里只是来写写我这2天抽空对seajs的了解并爬过的坑,和实现的一个小demo(纯属为了实现,高手请绕道); 一.环境工具及安装 1.首先,务必先说明,本demo是基于nodeJs环境下开发的,因此要安装nodeJs(地址:https://nodejs.org/en/): 2.接下来安装gulp: 在第一步成功的情况下,安装gulp构建工具,并且将其依赖到项目进来:同时需要安装browser-sync,gulp-seajs-co

s2sh的小demo

原文:s2sh的小demo 源代码下载地址:http://www.zuidaima.com/share/1550463713266688.htm 里面使用了拦截器和事务 项目之前的关系是适应配置文件关联的.不是注解 该项目是基于jdk7.0和tomcat 7的项目,我本地是jdk6所以没有验证.有问题大家回复下.另外没有sql文件,不过只有一个orm类.

用backbone实现的一个MVC的小demo

一.Apache配置 本实例需要使用php支持.要现在Apache中配置虚拟目录,在Apache下的httpd-vhosts.conf文件中添加如下代码 <VirtualHost *:80> DocumentRoot "D:/htdocs/backbone_demo" ServerName www.backbonedemo.cn </VirtualHost> 在windows的hosts文件中添加配置,hosts文件的位置在c:\windows\system32

结对项目小DEMO

这次小DEMO主要实现下面两个功能: 实现两个页面的相互跳转 通过多线程实现网络发送请求 本人负责界面与说明文档编写,搭档负责java代码的具体实现. xml代码: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_

React问答小demo

在学习react初期,看了一些视频和资料,react基础知识差不多学完,跟着网上的一个教程,做了一个小型的问答demo. 需求看图说: 1.点击"添加"按钮,显示问题输入表单,再次点击,隐藏表单.同时,点击"取消"按钮,隐藏表单. 2.输入问题标题和内容后,点击"确认"按钮,将问题显示在下方(按照投票数从高到低). 3.每个问题有加票和减票功能,在点击的同时,将问题按照投票数从高到低排序. 实现过程: 一.开发环境和工具 1.npm init (

第一个spring小demo

工作中用spring有一年多了,基本弄懂了bean配置文件的配置,但是却没有对spring配置文件,加载有更多的认识,今天动手写了第一个spring的小demo. 这个demo之前是想做web版的,但是web的启动比较麻烦,不如直接使用main方法执行直观,所以,就使用main方法来读取配置文件,启动spring. 看一下项目的结构  其中src部分是项目源码 和 配置文件applicationContext.xml WebContent 目录下面的WEB-INF/lib 目录下面存放的是spr