Nancy之给我们的网站添加自定义图标

简介: 原文:Nancy之给我们的网站添加自定义图标当我们在做一个网站时,可能经常会有这样一个需求,要给我们做的网站添加一个自定义的图标。 在Nancy中,默认是的下面这样 一个妹子的头像,其实也是挺好看的!! 那么当我们想要替换这个默认的,应该要怎么做呢? 下面就来看看具体的实现 首先,准备一张名为 favicon.
原文: Nancy之给我们的网站添加自定义图标

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

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

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

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

下面就来看看具体的实现

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

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

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

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

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

效果如下:

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

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

具体如下

1     public class CustomRootPathProvider : IRootPathProvider
2     {
3         public string GetRootPath()
4         {     
5             return AppDomain.CurrentDomain.GetData(".appPath").ToString();
6         }
7     }  

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

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

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

1      protected override IRootPathProvider RootPathProvider
2         {
3             get { return new CustomRootPathProvider(); }
4         } 

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

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

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

 1     protected override byte[] FavIcon
 2         {
 3             get { return this.favicon ?? (this.favicon = LoadFavIcon()); }       
 4         }
 5         private byte[] LoadFavIcon()
 6         {         
 7             using (var resourceStream = GetType().Assembly.GetManifestResourceStream("NancyFavIconDemo.favicon.ico"))
 8             {
 9                 var tempFavicon = new byte[resourceStream.Length];
10                 resourceStream.Read(tempFavicon, 0, (int)resourceStream.Length);
11                 return tempFavicon;
12             }
13         }  

 

其中,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参数构造函数,可以简单理解为指定要搜索的范围。
1         /// <summary>
2         /// Initializes a new instance of the <see cref="FavIconApplicationStartup"/> class, with the
3         /// provided <see cref="IRootPathProvider"/> instance.
4         /// </summary>
5         /// <param name="rootPathProvider">The <see cref="IRootPathProvider"/> that should be used to scan for a favicon.</param>
6         public FavIconApplicationStartup(IRootPathProvider rootPathProvider)
7         {
8             FavIconApplicationStartup.rootPathProvider = rootPathProvider;
9         }

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

 1         private static byte[] ExtractDefaultIcon()
 2         {
 3             var resourceStream =
 4                 typeof(INancyEngine).Assembly.GetManifestResourceStream("Nancy.favicon.ico");
 5 
 6             if (resourceStream == null)
 7             {
 8                 return null;
 9             }
10 
11             var result =
12                 new byte[resourceStream.Length];
13 
14             resourceStream.Read(result, 0, (int)resourceStream.Length);
15 
16             return result;
17         }    

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

 
里面还有一个“搜索”图标的方法
 1          private static byte[] LocateIconOnFileSystem()
 2         {
 3             if (rootPathProvider == null)
 4             {
 5                 return null;
 6             }
 7 
 8             var extensions = new[] { "ico", "png" };
 9 
10             var locatedFavIcon = extensions.SelectMany(EnumerateFiles).FirstOrDefault();
11             if (locatedFavIcon == null)
12             {
13                 return null;
14             }
15 
16             try
17             {
18                 return File.ReadAllBytes(locatedFavIcon);
19             }
20             catch (Exception e)
21             {
22                 if (!StaticConfiguration.DisableErrorTraces)
23                 {
24                     throw new InvalidDataException("Unable to load favicon", e);
25                 }
26 
27                 return null;
28             }
29         }

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

 

目录
相关文章
Avalonia使用默认弹窗
Avalonia使用默认弹窗
199 0
Avalonia使用默认弹窗
Ant Design Pro:项目的标签页标题与左上角项目标题图标如何修改?
Ant Design Pro:项目的标签页标题与左上角项目标题图标如何修改?
291 0
avalonia自定义弹窗
avalonia自定义弹窗
326 0
Typecho-handsome主题如何增加侧边导航栏
handsome主题在使用的过程中导航栏初始时只有首页一个导航页面,本篇文章主要讲解一下应该如何修改源代码增加多个导航栏并且为其设置子导航
276 1
Typecho-handsome主题如何增加侧边导航栏
|
Web App开发
Chrome 插件开发-右键菜单开发实战演示,浏览器页面右键菜单选项设置,插件右键菜单点击插件名跳转主页设置
Chrome 插件开发-右键菜单开发实战演示,浏览器页面右键菜单选项设置,插件右键菜单点击插件名跳转主页设置
984 0
Chrome 插件开发-右键菜单开发实战演示,浏览器页面右键菜单选项设置,插件右键菜单点击插件名跳转主页设置
|
数据库
如何在Joomla中删除组件菜单链接
有时,Joomla用户已删除组件,但仍在其管理区域中看到该组件的菜单项。
如何在Joomla中删除组件菜单链接
|
存储 搜索推荐 机器人
在Joomla中创建自定义404页面
默认情况下,Joomla不提供可以轻松创建和管理的404页面。当你的访问者访问你网站上的一个失效的URL时,404是非常有用的。 我将演示如何创建自定义404页面。 我们将创建一篇文章,添加一个菜单链接,然后在模板文件夹的文件中添加一些代码。
在不同的页面上显示不同的Joomla模板样式
模板样式是Joomla中非常强大的功能。它们允许您将同一模板的不同版本分配给特定页面。 在本教程中,我将向您展示如何分配两种模板样式。我们将为主页分配一种样式,为站点的其余部分分配另一种样式。 第1步.复制模板样式安装模板时,默认情况下会生成单个模板样式。
|
Web App开发 前端开发 JavaScript