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


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

阅读目录

  • Nancy介绍
  • 创建第一个应用
  • 使用技巧
  • 总结
回到顶部https://github.com/NancyFx/Nancy  官网:http://nancyfx.org  使用介绍:http://liulixiang1988.github.io/nancy-webkuang-jia.html

回到顶部回到顶部"~/Content/Image/favicon.ico"> "~/Content/Css/style.css" rel="stylesheet"> @RenderSection("style", required: false) @RenderBody() @RenderSection("scripts", required: false)

   3.控制器返回JSON值控制

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

    /// 
    /// 使用Newtonsoft.Json 替换Nancy默认的序列化方式
    /// 
    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(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.返回文件

        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目录下除了设置文件生成属性还可以通过项目生成后事件解决     批处理脚本如下
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
  回到顶部https://files.cnblogs.com/files/yanweidie/NancyConsole.rar,更多关于Nancy的使用可以下载TaskManager源码进行研究http://code.taobao.org/svn/TaskManagerPub/Branch。下一篇介绍如何使用MEF实现通用的参数配置管理。

如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】按钮。
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【关注我】。

如果,想给予我更多的鼓励,求打

因为,我的写作热情也离不开您的肯定支持。

感谢您的阅读,如果您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是焰尾迭 。