当我们在做一个网站时,可能经常会有这样一个需求,要给我们做的网站添加一个自定义的图标。

在Nancy中,默认是的下面这样

一个妹子的头像,其实也是挺好看的!!

那么当我们想要替换这个默认的,应该要怎么做呢?

下面就来看看具体的实现

首先,准备一张名为 favicon.ico或 favicon.png 图片

这里有两种实现方法提供参考

方法一:替换默认的图标(IRootPathProvider的实现)

如果我们是使用默认的IRootPathProvider的实现,这个时候,我们直接添加图片在我们的项目根目录即可

Nancy会去搜索这个默认的RootPath的favicon资源,它找到的第一个就将会是我们网站的图标。

效果如下:

有时候,默认的不一定是最好的,所以我们可以

自己去实现IRootPathProvider这个接口,但一个项目中,只能有一个实现(除了默认的)

具体如下

     public class CustomRootPathProvider : IRootPathProvider
{
public string GetRootPath()
{
return AppDomain.CurrentDomain.GetData(".appPath").ToString();
}
}

其中,GetRootPath返回的是绝对路径!!

这个路径可以用你能想到的任何方式得到!

然后,我们需要在“引导程序”中做点事

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

这样做是比较保险的一种做法(不需要特地将我们的图片资源设置为嵌入的资源)

方法二:使用嵌入的图标(Override FavIcon)

这种方法需要我们去重写 FacIcon这个方法

     protected override byte[] FavIcon
{
get { return this.favicon ?? (this.favicon = LoadFavIcon()); }
}
private byte[] LoadFavIcon()
{
using (var resourceStream = GetType().Assembly.GetManifestResourceStream("NancyFavIconDemo.favicon.ico"))
{
var tempFavicon = new byte[resourceStream.Length];
resourceStream.Read(tempFavicon, , (int)resourceStream.Length);
return tempFavicon;
}
}

其中,GetMainifestResourceStream的参数是“程序集名称.资源名称”(NancyFavIconDemo是我这个Demo的程序集名称,favicon.ico是我在根目录的一个图片)

还有重要的一步是

将我们的图片属性中的Build Action设置为 Embedded Resource(嵌入的资源)

具体原因我们可以参考Assembly.GetManifestResourceStream Method (String)里面的Remark

A manifest resource is a resource (such as an image file) that is embedded in the assembly at compile time. 

此时,我们同样可以看到相同的效果

如果 我们没有设置为嵌入的资源,那么我们的resourceStream对象将一直为空
 
下面我们来看看Nancy这一块内容的内部实现
关于favicon的实现就是在FavIconApplicationStartup.cs里面
来看看它的描述
就像前面说的,它会去找favicon,找到就用找到的,没找到就用默认的。
 
里面有一个带IRootPathProvider参数构造函数,可以简单理解为指定要搜索的范围。
         /// <summary>
/// Initializes a new instance of the <see cref="FavIconApplicationStartup"/> class, with the
/// provided <see cref="IRootPathProvider"/> instance.
/// </summary>
/// <param name="rootPathProvider">The <see cref="IRootPathProvider"/> that should be used to scan for a favicon.</param>
public FavIconApplicationStartup(IRootPathProvider rootPathProvider)
{
FavIconApplicationStartup.rootPathProvider = rootPathProvider;
}

下面是默认的图标实现方法,我们override的实现和它的基本一致!!

         private static byte[] ExtractDefaultIcon()
{
var resourceStream =
typeof(INancyEngine).Assembly.GetManifestResourceStream("Nancy.favicon.ico"); if (resourceStream == null)
{
return null;
} var result =
new byte[resourceStream.Length]; resourceStream.Read(result, , (int)resourceStream.Length); return result;
}

默认图标在ErrorPipeline.cs和FormatterExtensions.cs之间(不细心去看,压根就看不见)

 
里面还有一个“搜索”图标的方法
          private static byte[] LocateIconOnFileSystem()
{
if (rootPathProvider == null)
{
return null;
} var extensions = new[] { "ico", "png" }; var locatedFavIcon = extensions.SelectMany(EnumerateFiles).FirstOrDefault();
if (locatedFavIcon == null)
{
return null;
} try
{
return File.ReadAllBytes(locatedFavIcon);
}
catch (Exception e)
{
if (!StaticConfiguration.DisableErrorTraces)
{
throw new InvalidDataException("Unable to load favicon", e);
} return null;
}
}

我们可以发现,我们用的后缀可以是.ico和.png。

Nancy之给我们的网站添加自定义图标的更多相关文章

  1. easyui中tree控件添加自定义图标icon

    来源于:http://blog.163.com/lintianhuanhai@126/blog/static/165587366201421704420256/ <!DOCTYPE html&g ...

  2. 如何更换织梦cms系统的网站小图标

    织梦cms建站现在已经是很普遍的建站方式了,下面小编就分享一个简单的换网站小图标的方法! 一.登录自己网站的后台管理系统.在不修改织梦后台的情况下,默认的url是自己的网站后台dede目录下访问. 二 ...

  3. 给element添加自定义图标

    element为我们提供了丰富的好用的组件,图标的样式也很多,但还是有一些常用的图标没有在官方图标库里边,比如说微信.淘宝.支付宝等等.那么如何把我们需要的图标添加到进去呢? 因为element有官方 ...

  4. 网站favicon图标的显示问题

    今天在微信开发者工具发现一个错误,说是找不到favicon.ico这个文件. 这个就是标签式浏览器显示在页面title前面的小图标,移动端也没什么用,所以一直没在意,今天有空就研究了一下,发现还是有点 ...

  5. favicon.ico 网站小图标标识

    随便打开一个网页:比如 http://www.baidu.com/ 可以看到在浏览器的标签头上面显示了一个图标,这个图标是:,也就是我们常说的favicon.ico. 由于这篇文章主要讨论favico ...

  6. 网站微图标,页标签,favicon.ico

    随便打开一个网页:比如 http://www.baidu.com/ 可以看到在浏览器的标签头上面显示了一个图标,也就是我们常说的favicon.ico, 由于这篇文章主要讨论favicon.ico,以 ...

  7. 给网站添加图标: Font Awesome

    先贴上各种图标的网址:https://fontawesome.com/?from=io 1.打开网址,我们可以看到: 像我这种英语不好的,直接用谷歌浏览器进行翻译中文好了,自己还是有点B数的····· ...

  8. Python3.7将普通图片(png)转换为SVG图片格式并且让你的网站Logo(图标)从此”动”起来

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_148 在之前的几篇文章中,介绍了业界中比较火爆的图片技术SVG(Scalable Vector Graphics),比如Iconf ...

  9. 在浏览器标签显示网站logo图标

    在网站根目录下添加favicon.ico文件,并在网页添加如下代码: <link rel="bookmark" href="~/favicon.ico" ...

随机推荐

  1. 代码自定义双色title的按钮

    所图所示,通过代码自定义这样的按钮. .h文件 // // CustomButtom.h // testPlus // // Created by 鹰眼 on 14/10/20. // Copyrig ...

  2. nmea协议

    NMEA协议 信息类型为: GPGSV:可见卫星信息 GPGLL:地理定位信息 GPRMC:推荐最小定位信息 GPVTG:地面速度信息 GPGGA:GPS定位信息 GPGSA:当前卫星信息 1. Gl ...

  3. Principles of measurement of sound intensity

    Introduction In accordance with the definition of instantaneous sound intensity as the product of th ...

  4. Nova PhoneGap框架 第八章 滚动条

    你可能会疑惑为什么滚动条这么常见的功能会在这里单独列出,但如果你有过PhoneGap开发经验的话,你就会发现要在Android 2.3 里面实现滚动条那真不是一件容易的事. 8.1 概述 目前主流的P ...

  5. 剑指Offer面试题:20.栈的压入、弹出序列

    一.题目:栈的压入.弹出序列 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1.2.3.4.5是某栈的压栈序列,序列4 ...

  6. EDM制作要点

    EDM是Email Direct Marketing的缩写,虽然也是html,但是和我们在网页上使用的html不同,因为安全原因,各大邮箱服务商级邮件客户端都会对邮件内容进行一定程度上的处理,不会按照 ...

  7. MA均线组合

    MA5.MA13.MA21.MA34.MA55.MA90.MA120.MA250

  8. How To Use Goto?

    看到,网上很多人对于goto的询问, 因为本身在工作中经常使用到,所以写下此文, 如有错误, 请指出. 本人写博文的时候主要从事C++工作 对于goto的态度,本人目前成长如下: 学生时代 老师课堂上 ...

  9. Java 积累复习用

    1.jvm 默认编码:Java的默认编码 2.jvm heap : Java虚拟机的内存组成以及堆内存介绍 3.Java命令学习系列(一)--Jps 4.Java命令学习系列(二)--Jstack 5 ...

  10. Sublime 快捷键

    语法快捷键: 后代:> 缩写:nav>ul>li <nav> <ul> <li></li> </ul> </nav& ...