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类型注册到应用中,问我是 ...
随机推荐
- mysql8绿色免安装win64版本(自带heidisql.exe客户端)应该兼容老版第三方工具。
https://pan.baidu.com/s/1cvQ4AJX6rmqSpMhBQTPz4Q 如果缺c库,自己去找下. 使用方法:先执行initdb.bat初始化数据 如果要安装为服务:执行inst ...
- DOM4J熟知
什么是解析xml 系统最终会从xml中读取数据. 读取的过程就是解析. CRUD ==> 增删改查 ==> create read update delete ==> 解析指的就是读 ...
- 《T-SQL查询》读书笔记Part 2.执行计划
一.关于执行计划 执行计划是优化器生成的用于确定如何处理一个给定查询的“工作计划”.一个计划包含一组运算符,通常按照特定的顺序来应用这些运算符.此外,一些运算符可以在它们之前的运算符还在处理时被应用( ...
- JavaScript(三、DOM文档对象模型)
一.什么是DOM DOM 是 Document Object Model(文档对象模型)的缩写. DOM 是 W3C(万维网联盟)的标准. DOM 定义了访问 HTML 和 XML 文档的标准: &q ...
- QT5:C++实现基于multimedia的音乐播放器(一)
上一篇里简略的描述了一下播放器的实现,这一篇开始具体描述一下过程. 环境配置:Qt Creator 打开Qt Creator,创建一个new project,项目名称随你喜欢(我的是MusicPlay ...
- vector的内存分配问题
vector的内存增长问题,其实无非是vector中size()和capacity()问题.vector的一个缺点就是它的内存分配是按照2的倍数分配内存的.当当前容量对插入元素不够时,分配一块新的内存 ...
- 基于Go的websocket消息服务
3个月没写PHP了,这是我的第一个中小型go的websocket微服务.那么问题来了,github上那么多轮子,我为什么要自己造轮子呢? Why 造轮子? 因为这样不仅能锻炼自己的技术能力,而且能帮助 ...
- npm安装项目出错
F:\ajax>npm install iview --savenpm WARN saveError ENOENT: no such file or directory, open 'F:\aj ...
- 错误 C2280 Union : 尝试引用已删除的函数 以及 警告 C4624 “Grade”: 已将析构函数隐式定义为“已删除”的一种解决方法
Union 是C/C++语言中的一种结构类型,用于定义可共享内存的数据变量的一种方式,初次使用Union联合体时可能会遇到以下问题: 错误 C2280 Union : 尝试引用已删除的函数 警告 C4 ...
- python中读写excel并存入mysql
为了一个突如其来的想法:用python简单解决就好.现在算是把这个项目需要的基础功能坑都填完了.剩下就是AI和数据展示方面的坑了. 今天遇到的坑是: 1.从excel读出的中文是乱码 2.中文写入my ...