天天看點

Nancy 寄宿OWin

原文: Nancy 寄宿OWin 一:建立一個空項目

Nancy 寄宿OWin
二:安裝模闆

Install-Package Nancy
Install-Package Nancy.Owin
Install-Package Microsoft.Owin
install-package  Nancy.ViewEngines.Razor      

三:建好的項目圖

Nancy 寄宿OWin

四:RazorConfig類的内容及作用

using System.Collections.Generic;
using Nancy.ViewEngines.Razor;

namespace NancyMvc.Config
{
    /// <summary>
    /// Razor配置,如果你需要使用 cshtml,這個配置比較重要,當然,也可以在這兒加入其它的類
    /// </summary>
    public class RazorConfig: IRazorConfiguration
    {
        /// <summary>
        /// 需加載的程式集清單
        /// </summary>
        /// <returns></returns>
        public IEnumerable<string> GetAssemblyNames()
        {
            //加了這句,才能處理 cshtml
            yield return "System.Web.Razor";
        }
        /// <summary>
        /// 需要添加到cshtml中的名字空間
        /// </summary>
        /// <returns></returns>
        public IEnumerable<string> GetDefaultNamespaces()
        {
            yield return "System.Web.Razor";
        }

        /// <summary>
        /// 是否自動引用model名字空間
        /// </summary>
        public bool AutoIncludeModelNamespace
        {
            get { return true; }
        }
    }
}      

五:SiteRootPath 内容及作用,不可少,不然項目有錯誤

using System;
using Nancy;

namespace NancyMvc.Config
{
    /// <summary>
    /// 提供網站實體路徑的類
    /// </summary>
    public class SiteRootPath : IRootPathProvider
    {
        /**************************************************************
 * TinyFox Owin Server 預設情況下
 * 網站是放在 TinyFox 程序所在檔案夾下的site/wwwroot中的
 * ----------------------------------------------------------
 * 如果你把 NancyFx 的 Views 頁放在其它的地方,應該作相應修改
 *******************************************************************/

        /// <summary>
        /// 網站根檔案夾實體路徑(for tinyfox)
        /// </summary>
        //  static readonly string _RootPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "site", "wwwroot");
        // (for Jexus Web Server or Host in ASP.NET),如果自定義root後需要使用
        static readonly string _RootPath = AppDomain.CurrentDomain.GetData(".appPath").ToString();


        /// <summary>
        /// 擷取網站或WEB應用的根檔案夾的實體路徑
        /// </summary>
        /// <returns></returns>
        public string GetRootPath()
        {
            return _RootPath;
        }
    }
}      

六:MainModule的内容與作用

using System;
using System.Collections.Generic;
using System.Drawing;
using NancyMvc.Filter;

namespace NancyMvc.Controller
{
    public class MainModule: BaseNancyModule
    {
        /// <summary>
        /// 構造函數
        /// </summary>
        public MainModule()
        {

            //在構造函數中進行路由配置
            Get["/home"] = UserFont;
        }

        private dynamic UserFont(dynamic arg)
        {
            //顯示cshtml頁
            return View["Home/index"];
        }
    }
}      

七:BaseNancyModule 的内容與作用

using System;
using System.Collections.Generic;
using System.Linq;
using Nancy;

namespace NancyMvc.Filter
{
    public class BaseNancyModule: NancyModule
    {
        public BaseNancyModule()
        {
            //請求之前
            Before += context =>
            {

                return null;
            };

            //請求之後
            After += context =>
            {
                context.Response.ContentType = "text/html;charset=utf-8";
            };
        }
    }
}      

八:MyStatusHandler

using Nancy;
using Nancy.ErrorHandling;
using Nancy.ViewEngines;

namespace NancyMvc.Handler
{
    /// <summary>
    /// 自定義http status處理類
    /// </summary>
    public class MyStatusHandler : IStatusCodeHandler
    {
        private IViewRenderer viewRenderer;
        public MyStatusHandler(IViewRenderer viewRenderer)
        {
            this.viewRenderer = viewRenderer;
        }
        /// <summary>
        /// 具體處理過程
        /// </summary>
        /// <param name="statusCode"></param>
        /// <param name="context"></param>
        public void Handle(HttpStatusCode statusCode, NancyContext context)
        {
            var response = viewRenderer.RenderView(context, "Status/404");
            response.StatusCode = statusCode == HttpStatusCode.NotFound ? HttpStatusCode.OK : statusCode;
            context.Response = response;
        }
        /// <summary>
        /// 目前狀态是否需要自己處理
        /// </summary>
        /// <param name="statusCode"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public bool HandlesStatusCode(HttpStatusCode statusCode, NancyContext context)
        {
            //return false;
            return (statusCode == HttpStatusCode.NotFound
                //|| statusCode == HttpStatusCode.ServiceUnavailable
                //|| statusCode == HttpStatusCode.InternalServerError
                );
        }
    }
}      

九:Adapter 

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Owin.Builder;

namespace NancyMvc
{
    class Adapter
    {
        static Func<IDictionary<string, object>, Task> _owinApp;

        /// <summary>
        /// 預設構造函數
        /// </summary>
        public Adapter()
        {
            var builder = new AppBuilder();
            var startup = new Startup();
            startup.Configuration(builder);
            _owinApp = builder.Build();

        }
        /// <summary>
        /// *** JWS所需要的關鍵函數 ***
        /// </summary>
        /// <param name="env">新請求的環境字典,具體内容參見OWIN标準</param>
        /// <returns>傳回一個正在運作或已經完成的任務</returns>
        public Task OwinMain(IDictionary<string, object> env)
        {
            //如果為空
            if (_owinApp == null) return null;

            //将請求交給Microsoft.Owin處理
            return _owinApp(env);
        }
    }
}      

十:Startup 

using Owin;

namespace NancyMvc
{
    public class Startup
    {
        public void Configuration(IAppBuilder builder)
        {
            builder.UseNancy();
        }
    }
}      

十一:配置properties

Nancy 寄宿OWin

啟動外部程式是tinyfox的包 下載下傳位址http://linuxdot.net/down/tinyfox-2.3.tar.gz)

指令行參數中的 -p 8083是你配置的端口号  -root 後面的是你目前項目的位置,不需要配到bin

Nancy 寄宿OWin

本文章主要參考來源 http://www.cnblogs.com/gaobing/p/4969581.html

繼續閱讀