前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用Nancy.Host实现脱离iis的Web应用

使用Nancy.Host实现脱离iis的Web应用

作者头像
用户1168362
发布于 2018-01-05 07:37:27
发布于 2018-01-05 07:37:27
1.6K00
代码可运行
举报
文章被收录于专栏:.net core新时代.net core新时代
运行总次数:0
代码可运行

  本篇将介绍如何使用Nancy.Host实现脱离iis的Web应用,在开源任务管理平台TaskManagerV2.0代码里面已经使用了Nancy.Host实现自宿主的Web应用。学习Nancy之前最好了解一下ASP.NET MVC,因为Nancy和MVC实在是太相似了。

阅读目录

  • Nancy介绍
  • 创建第一个应用
  • 使用技巧
  • 总结

回到顶部

Nancy介绍

    Nancy是一个轻量级的用来创建基于HTTP的服务的框架,该框架的可以运行在.net或者mono上。 Nancy处理和mvc类似的DELETEGETHEADOPTIONSPOSTPUT,PATCH请求,如果你有mvc开发的经验相信可以快速入门。最重要的一点可以让你的Web应用脱离IIS的束缚。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Module : NancyModule
{
    public Module()
    {
        Get["/greet/{name}"] = x => {
            return string.Concat("Hello ", x.name);
        };
    }
}

特征

  1. 自底向上全套都是新构建的,移除了对其他框架的引用和限制。
  2. Run anywhere. Nancy 能够在ASP.NET/IIS,OWIN,Self-hosting中运行。
  3. 集成支持各种View engine(Razor, Spark, dotLiquid, SuperSimpleViewEngine...)

资源

    Github:https://github.com/NancyFx/Nancy  官网:http://nancyfx.org  使用介绍:http://liulixiang1988.github.io/nancy-webkuang-jia.html

回到顶部

创建第一个应用

  1.创建控制台程序,引用相关Package

使用Nuget安装Nancy,Nancy.Hosting.Self,Nancy.Viewengines.Razor,Newtonsoft.Json四个Package

  2.监听端口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Program
    {
        static void Main(string[] args)
        {
            try
            {
                int port = 9000;
                string url = string.Format("http://localhost:{0}", port);
                var _host = new NancyHost(new Uri(url));
                _host.Start();
                Process.Start(url);
                Console.WriteLine("站点启动成功,请打开{0}进行浏览",url);
            }
            catch (Exception ex)
            {
                Console.WriteLine("站点启动失败:"+ex.Message);
            }
            Console.ReadKey();
        }
    }                                                                                                                        

  3.创建模块和视图

我们这里使用Razor视图引擎,熟悉MVC的应该很清楚怎么使用这里只做简单演示

  新建控制器文件夹Modules,视图文件夹Views

 创建控制器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class HomeModule : NancyModule
    {
        public HomeModule()
        {
            //主页
            Get["/"] = r =>
            {
                return Response.AsRedirect("/Home/Index");
            };

            //主页
            Get["/Home/Index"] = r =>
            {
                return View["index", "测试站点"];
            };

            ///桌面
            Get["/DestTop"] = r =>
            {
                return View["DestTop"];
            };
        }
    }

 小知识点:Nancy里面的所有控制器都需要继承NancyModule类,类比MVC的控制器都需要继承Controller

创建视图

新建index.cshtml视图内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase

@{
    ViewBag.Title = @Model;
}

@section style{
   
}

我是第一个Nancy应用


@section scripts{
    <script>
      
    </script>
}

至此一个简单的应用完成了,运行项目后你会发现提示找不到视图index,是因为index视图没有拷贝到 bin\Debug目录下,添加视图的时候需要手工设置文件属性->始终复制到输出目录。如果嫌这样设置太麻烦可以采取我后面提供的一种方案。

回到顶部

使用技巧

  仅上面这点东西做一个Web应用是完全不够的,下面讲解一下进阶内容和使用小技巧。

1.使用CSS和JS等静态资源

  要想在视图里面使用静态资源需要设置允许访问的静态资源类型,通过继承DefaultNancyBootstrapper类重写ConfigureConventions方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CustomBootstrapper : DefaultNancyBootstrapper
    {
        protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
        {
            base.ApplicationStartup(container, pipelines);

            //pipelines.BeforeRequest += ctx =>
            //{
            //    return null;
            //};

            pipelines.AfterRequest += ctx =>
            {
                // 如果返回状态吗码为 Unauthorized 跳转到登陆界面
                if (ctx.Response.StatusCode == HttpStatusCode.Unauthorized)
                {
                    ctx.Response = new RedirectResponse("/login?returnUrl=" + Uri.EscapeDataString(ctx.Request.Path));
                }
                else if (ctx.Response.StatusCode == HttpStatusCode.NotFound)
                {
                    ctx.Response = new RedirectResponse("/Error/NotFound?returnUrl=" + Uri.EscapeDataString(ctx.Request.Path));
                }
            };

            pipelines.OnError += Error;
        }

        protected override IRootPathProvider RootPathProvider
        {
            get { return new CustomRootPathProvider(); }
        }

        /// <summary>
        /// 配置静态文件访问权限
        /// </summary>
        /// <param name="conventions"></param>
        protected override void ConfigureConventions(NancyConventions conventions)
        {
            base.ConfigureConventions(conventions);

            ///静态文件夹访问 设置 css,js,image
            conventions.StaticContentsConventions.AddDirectory("Content");
        }

        protected override void ConfigureApplicationContainer(TinyIoCContainer container)
        {
            base.ConfigureApplicationContainer(container);
            //替换默认序列化方式
            container.Register<ISerializer, CustomJsonNetSerializer>();
        }

        private dynamic Error(NancyContext context, Exception ex)
        {
            //可以使用log4net记录异常 ex 这里直接返回异常信息
            return ex.Message;
        }
    }

 这里设置的根目录下的Content文件夹下所有文件都可以被访问,我们可以将所有静态资源放在该文件夹下

 2.使用视图模版

 视图模版使用方式和mvc的一模一样,在视图文件夹下创建_ViewStart.cshtml视图,内容如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@{
    Layout = "/Shared/_Layout.cshtml";
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
_Layout.cshtml里面放置页面公共的内容比如公共css和js,定义相关占位符
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0" />
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="format-detection" content="telephone=no">
    <title>@ViewBag.Title</title>
    <link rel="shortcut icon" type="image/x-icon" href="~/Content/Image/favicon.ico">
    <link href="~/Content/Css/style.css" rel="stylesheet">
    @RenderSection("style", required: false)
</head>
<body>
    @RenderBody()

    <script src="~/Content/Scripts/jquery-1.10.2.min.js"></script>
    @RenderSection("scripts", required: false)
</body>
</html>

 3.控制器返回JSON值控制

 默认Nancy使用的是自己内置的JSON序列化库,个人倾向于使用JSON.NET库。所以通过设置替换成了JSON.NET。在CustomBootstrapper的ConfigureApplicationContainer容器里面替换了序列化库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /// <summary>
    /// 使用Newtonsoft.Json 替换Nancy默认的序列化方式
    /// </summary>
    public class CustomJsonNetSerializer : JsonSerializer, ISerializer
    {
        public CustomJsonNetSerializer()
        {
            ContractResolver = new DefaultContractResolver();
            DateFormatHandling = DateFormatHandling.IsoDateFormat;
            Formatting = Formatting.None;
            NullValueHandling = NullValueHandling.Ignore;
        }

        public bool CanSerialize(string contentType)
        {
            return contentType.Equals("application/json", StringComparison.OrdinalIgnoreCase);
        }

        public void Serialize<TModel>(string contentType, TModel model, Stream outputStream)
        {
            using (var streamWriter = new StreamWriter(outputStream))
            using (var jsonWriter = new JsonTextWriter(streamWriter))
            {
                Serialize(jsonWriter, model);
            }
        }

        public IEnumerable<string> Extensions { get { yield return "json"; } }
    }

 4.返回文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        Get["/Home/Download"] = r =>
            {
                string path = AppDomain.CurrentDomain.BaseDirectory+@"\Content\UpFile\使用说明.docx";
                if (!File.Exists(path))
                {
                    return Response.AsJson("文件不存在,可能已经被删除!");
                }
                var msbyte = default(byte[]);
                using (var memstream = new MemoryStream())
                {
                    using (StreamReader sr = new StreamReader(path))
                    {
                        sr.BaseStream.CopyTo(memstream);
                    }
                    msbyte = memstream.ToArray();
                }

                return new Response()
                {
                    Contents = stream => { stream.Write(msbyte, 0, msbyte.Length); },
                    ContentType = "application/msword",
                    StatusCode = HttpStatusCode.OK,
                    Headers = new Dictionary<string, string> {
                        { "Content-Disposition", string.Format("attachment;filename={0}", HttpUtility.UrlPathEncode(Path.GetFileName(path))) },
                        {"Content-Length",  msbyte.Length.ToString()}
                    }
                };
            };

 5.视图找不到解决方案

 由于需要将视图文件和静态资源文件拷贝到bin目录下除了设置文件生成属性还可以通过项目生成后事件解决

批处理脚本如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rd/s/q $(TargetDir)Content
rd/s/q $(TargetDir)Views
xcopy $(ProjectDir)\Content\*.* $(TargetDir)Content\ /s/d/r/y
xcopy $(ProjectDir)\Views\*.* $(TargetDir)Views\ /s/d/r/y

回到顶部

总结

      本篇要介绍的内容到此结束了,源代码下载地址:http://files.cnblogs.com/files/yanweidie/NancyConsole.rar,更多关于Nancy的使用可以下载TaskManager源码进行研究。

下一篇介绍如何使用MEF实现通用的参数配置管理。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-05-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
HttpClient介绍
使用RestSharp 库消费Restful Service 中介绍了一个开源的Http Client库RestSharp。在ASP.NET MVC 4中也带来.NET框架中的Http Client。它提供了一个灵活的、可扩展的API来访问一切通过HTTP公开的RESTful服务。HttpClient是ASP.NET Web API 的一部分,直接包含在.NET 4.5中,也可以单独安装ASP.NET MVC4,可以通过Nuget包获取,包里面包含以下3部分: System.Net.Http: The ma
张善友
2018/01/19
1.4K0
HttpClient介绍
项目练习:自己写一个读取指定html文件的Razor
项目要求 练习2: @RPHelper.Include("~/1.html") 把~/1.html内容原样输出到这个位置 是项目 ProjectLX001 第一步:假定读取的html文件是这个 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title
静心物语313
2020/03/24
5420
项目练习:自己写一个读取指定html文件的Razor
Razor模板引擎工作原理及怎么调用外部方法演示
RazorEngine引擎就是将cshtml模板文件进行了字符串的拼接,然后,再封装为一个程序集。。。再通过一般处理程序,进行调用。。
静心物语313
2020/03/24
1.4K0
Razor模板引擎工作原理及怎么调用外部方法演示
Spring Boot 之Web开发
2)、SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来
兮动人
2021/06/11
1.1K0
Spring Boot 之Web开发
ASP.NET Core MVC 视图
布局用于提供各个页面所需的公共部分,如:菜单、页头、页尾等。在ASP.NET Core中默认的布局文件是位于/Views/Shared文件夹下的_Layout.cshtml文件:
雪飞鸿
2019/05/19
2.4K0
自己写一个DropDownList控件
预备知识: 1.关于object.Equals(objA,objB)方法 namespace ObjectEqua方法探究 { class Program { static void Main(string[] args) { int i = 1; int j = 1; object objA = i; object objB = j; C
静心物语313
2020/03/24
9220
自己写一个DropDownList控件
SpringBoot | SpringBoot Web开发
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3C8F9icU-1662430755757)(https://cdn.jsdelivr.net/gh/BoBooY-GitHub/SpringBoot_NoteImgs@main/imgs/202209041108838.png)]
啵啵鱼
2022/11/23
1.1K0
SpringBoot | SpringBoot Web开发
Spring Web MVC 基础
在一个项目中,如果业务流程比较简单的时候,可以把控制器的功能交给视图,项目架构中只有视图和模型,没有控制器。
xiaozhangStu
2023/05/04
5660
ASP.NET Web API 应用教程(一) ——数据流使用
相信已经有很多文章来介绍ASP.Net Web API 技术,本系列文章主要介绍如何使用数据流,HTTPS,以及可扩展的Web API 方面的技术,系列文章主要有三篇内容。 主要内容如下: I  数据流 II 使用HTTPS III 可扩展的Web API 文档 项目环境要求 VS 2012(SP4)及以上, .Net 框架4.5.1 Nuget包,可在packages.config 文件中查寻 本文涉及的知识点 ActionFilter AuthorizationFilter DelegateHand
葡萄城控件
2018/01/10
2.4K0
ASP.NET  Web API 应用教程(一) ——数据流使用
用Owin Host实现脱离IIS跑Web API单元测试
当前文章阅读前推荐阅读 OwinSelfHost自宿主的使用 文章 操作步骤与上述文章结构大致雷同:
happlyfox
2019/03/14
9720
用Owin Host实现脱离IIS跑Web API单元测试
【小家Spring】Spring MVC容器的web九大组件之---ViewResolver源码详解---视图View详解
上篇文章已经重点讲解过了:ViewResolver视图解析器 【小家Spring】Spring MVC容器的web九大组件之—ViewResolver源码详解—视图解析器ViewResolver详解
YourBatman
2019/09/03
1.3K0
【小家Spring】Spring MVC容器的web九大组件之---ViewResolver源码详解---视图View详解
Web开发
Spring Boot provides auto-configuration for Spring MVC that works well with most applications.(大多场景我们都无需自定义配置)
用户9615083
2022/12/25
2.7K0
Web开发
springBoot——Web开发简介【七】
1. 所有 /webjars/ ,都去 classpath:/META-INF/resources/webjars/ 找资源** webjars:以jar包的方式引入静态资源 http://www.webjars.org/
思索
2024/08/16
1110
springBoot——Web开发简介【七】
【ASP.NET Core 基础知识】--MVC框架--Views和Razor语法
在ASP.NET Core的MVC(Model-View-Controller)框架中,View 扮演着呈现用户界面的角色。View负责展示应用程序的数据给用户,并接收用户的输入。它与Model和Controller协同工作,通过模型绑定从Controller获取数据,然后使用Razor语法或其他视图引擎将数据呈现为用户可见的HTML。
喵叔
2024/01/11
1.4K0
SpringMVC入门终结篇
如果采用上面的合并配置文件,那么相当于系统一起动只有一个IOC容器,这样一部分报错,整个容器就凉凉
大忽悠爱学习
2021/11/15
1.5K0
ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习
  在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor。在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎。
Edison Zhou
2018/08/20
2K0
ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习
Spring学习笔记(十九)——springboot Web开发和模板引擎thymeleaf语法使用
2)、SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来
不愿意做鱼的小鲸鱼
2022/09/26
8490
Spring学习笔记(十九)——springboot Web开发和模板引擎thymeleaf语法使用
SpringBoot与Web开发
web开发 1)、创建SpringBoot应用,选中我们需要的模块; 2)、SpringBoot已经默认将这些场景已经配置好了,只需要在配置文件中指定少量配置就可以运行起来 3)、自己编写业务代码; 自动配置原理? 这个场景SpringBoot帮我们配置了扫码?能不能修改?能不能改哪些配置?能不能扩展?xxx xxxAutoConfiguration:帮我们给容器中自动配置组件; xxxProperties:配置类来 封装配置文件的内容; 2、SpringBoot对静态资源的 映射规则 @Configura
用户1112962
2018/07/04
8790
ASP.NET Core Views系列二
部分视图是普通的视图文件(.cshtml),可以嵌入到另外的视图文件里,这意味这相同的视图文件能被使用在多个地方并且减少代码重复,如果在我们应用程序中有重复的视图,我们可以将这个视图作为部分视图,在别的视图中加载这个文件,这种方式可以阻止代码重复
郑子铭
2023/08/30
2680
ASP.NET Core Views系列二
ASP.NET MVC 5 - 视图
在本节中,你要去修改HelloWorldController类,使用视图模板文件,在干净利索地封装的过程中:客户端浏览器生成HTML。 您将创建一个视图模板文件,其中使用了ASP.NET MVC 3所引入的Razor视图引擎(Razor view engine)。Razor视图模板文件使用.cshtml文件扩展名,并提供了一个优雅的方式来使用C#语言创建所要输出的HTML。用Razor编写一个视图模板文件时,将所需的字符和键盘敲击数量降到了最低,并实现了快速,流畅的编码工作流程。 当前在控制器类中的Inde
葡萄城控件
2018/01/10
3.5K0
ASP.NET MVC 5 - 视图
相关推荐
HttpClient介绍
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验