ASP.Net Core MVC 发生二次请求
Bug回忆录
昨天搭建新框架的时候,遇到一个很奇怪的“Bug”,每次请求都会触发两次Aciton,举例子吧,Demo:
_Layout.cshtml
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <link rel="icon" type="image/x-icon" href="#" />
- <title>@ViewData["Title"] - WebApplicationDemo</title>
- <meta name="keywords" content="">
- <meta name="description" content="">
- <meta name="author" content="Lio.Huang">
- </head>
- <body>
- <div style="background-color:#808080;height:200px;">
- @RenderBody()
- </div>
- </body>
- </html>
HomeController
- using System.Diagnostics;
- using System.Linq;
- using System.Threading.Tasks;
- using Microsoft.AspNetCore.Mvc;
- namespace WebApplicationDemo.Controllers
- {
- public class HomeController : Controller
- {
- public IActionResult Index()
- {
- return View();
- }
- }
- }
Index.cshtml
- <h1>Hi, I'm index page.</h1>
最简单不过的代码,然后启动项目,无意中就发现了,过程中发生了两次请求:
再新增一个控制器测试仍然是如此。
Debug
试想第二次请求发生了什么?加入一个请求统计的接口,拦截第二次请求。开撸:
- public interface IRequestStat
- {
- int RequestNum { get; }
- /// <summary>
- /// 是否跳转
- /// </summary>
- /// <returns></returns>
- bool Redirect();
- /// <summary>
- /// 请求次数累计
- /// </summary>
- void Add();
- }
- public class RequestStat : IRequestStat
- {
- public int RequestNum { get; private set; }
- public RequestStat()
- {
- RequestNum = ;
- }
- public void Add()
- {
- RequestNum++;
- }
- public bool Redirect()
- {
- return RequestNum == ;
- }
- }
- public class HomeController : Controller
- {
- private readonly IRequestStat request;
- public HomeController(IRequestStat request)
- {
- this.request = request;
- }
- public IActionResult Index()
- {
- if (request.Redirect())
- {
- return Redirect("https://www.baidu.com/");
- }
- request.Add();
- return View();
- }
- }
当第二次请求时候,重定向到百度网。
然后在Startup中注册为单例:
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddMvc();
- services.AddSingleton<IRequestStat, RequestStat>();
- }
启动!
发现它并没有跳转到百度网,但是也发现了"Bug"所在,favicon.ico是来自百度的。
第二次请求,其实浏览器是请求favicon.ico的tab图标文件。
如果页面没有提供favicon.ico时会从请求里尝试获取,但在生产过程中,Action是带有业务逻辑,我们肯定是不希望莫名其妙的被触发一次。
解决
在_Layout.cshtml中把favicon.ico加上即可
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <link rel="icon" type="image/x-icon" href="/favicon.ico" />
- <title>@ViewData["Title"] - WebApplicationDemo</title>
- <meta name="keywords" content="">
- <meta name="description" content="">
- <meta name="author" content="Lio.Huang">
- </head>
- <body>
- <div style="background-color:#808080;height:200px;">
- @RenderBody()
- </div>
- </body>
- </html>
真是一不小心就掉坑了,记录一下爬坑日志,一步一个 脚印 坑。
ASP.Net Core MVC 发生二次请求的更多相关文章
- 解说asp.net core MVC 过滤器的执行顺序
asp.net core MVC 过滤器会在请求管道的各个阶段触发.同一阶段又可以注册多个范围的过滤器,例如Global范围,controller范围等.以ActionFilter为例,我们来看看过滤 ...
- asp.net core mvc 集成miniprofiler
原文:asp.net core mvc 集成miniprofiler asp.net core mvc 集成miniprofiler 一.环境介绍 二.监控asp.net 页面 三.监控执行的sql语 ...
- asp.net core MVC 过滤器之ActionFilter过滤器(二)
本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter过滤器(一) asp.net core ...
- ASP.NET Core MVC请求超时设置解决方案
设置请求超时解决方案 当进行数据导入时,若导入数据比较大时此时在ASP.NET Core MVC会出现502 bad gateway请求超时情况(目前对于版本1.1有效,2.0未知),此时我们需要在项 ...
- 使用 ASP.NET Core MVC 创建 Web API(二)
使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 六.添加数据库上下文 数据库上下文是使用Entity Framewor ...
- 从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板
标题:从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11155 ...
- asp.net core MVC 全局过滤器之ExceptionFilter异常过滤器(一)
本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter异常过滤器(一) asp.net cor ...
- 使用 ASP.NET Core MVC 创建 Web API——响应数据的内容协商(七)
使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 使用 ASP.NET Core MVC 创建 Web API(二) 使 ...
- [ASP.NET Core MVC] 如何实现运行时动态定义Controller类型?
昨天有个朋友在微信上问我一个问题:他希望通过动态脚本的形式实现对ASP.NET Core MVC应用的扩展,比如在程序运行过程中上传一段C#脚本将其中定义的Controller类型注册到应用中,问我是 ...
随机推荐
- Drupal7.8的安装注意的问题
首先推荐在安装之前,首先阅读一下官方的Installation guide ,说实话话,这玩意安装没有Joomla安装那么平滑,大多数问题,guide都会提到.我是先安装后看的这个guide,比较折腾 ...
- ImageMagick
http://blog.csdn.net/lan861698789/article/details/7738383 1.官网 http://www.imagemagick.org/script/ind ...
- MySQL 忘记root密码解决方法,基于Ubuntu 14.10
忘记MySQL root密码解决方法,基于Ubuntu 14.10 忘了mysql密码,从网上找到的解决方案记录在这里. 编辑mysql的配置文件/etc/mysql/my.cnf,在[mysqld] ...
- 使用Android Studio Gradle实现友盟多渠道打包
最新项目中要求在友盟后台看到不同渠道的统计,Android大大小小的应用市场要几百个,要一个一个手工打包那一天也干不完,还好是有大牛的,弄出了好多解决方法,就Gradle做一下记录和分享,首先看一些理 ...
- java基础语法3
逻辑运算符 &:与,和有共同的,必须条件都满足才是true 有false就返回false,必须都是true才返回true |:或者,其中有一个满足条件就返回true ^亦或,相同是false, ...
- servlet3.0 新特性——异步处理
Servlet 3.0 之前,一个普通 Servlet 的主要工作流程大致如下: 首先,Servlet 接收到请求之后,可能需要对请求携带的数据进行一些预处理: 接着,调用业务接口的某些方法,以完成业 ...
- DB2 存储过程创建、系统表
前段时间做了数据表拆分,进行数据迁移,用到一些SQL命令,语句记录下来 db2look是DB2用于生成数据库DDL语句的一个工具: 命令:db2look -d DBname -a -e -p -i u ...
- JVM堆内存监测的一种方式,性能调优依旧任重道远
上月,由极客邦.InfoQ和听云联合主办2016 APMCon中国应用性能管理大会圆满落下帷幕.会上,Java冠军Martijn Verburg进行了一场Java and the Machine的分享 ...
- Elasticsearch: 权威指南 » 深入搜索 » 多字段搜索 » 多数字段 good
跨字段实体搜索 » 多数字段编辑 全文搜索被称作是 召回率(Recall) 与 精确率(Precision) 的战场: 召回率 ——返回所有的相关文档:精确率 ——不返回无关文档.目的是在结果的 ...
- SQL查询中用到的函数
数据库表 students id name sex age address 101 张汉 男 14 杭州 102 欧阳钦 男 13 杭州 103 吴昊 男 14 北京 104 钱进进 男 ...