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 发生二次请求的更多相关文章

  1. 解说asp.net core MVC 过滤器的执行顺序

    asp.net core MVC 过滤器会在请求管道的各个阶段触发.同一阶段又可以注册多个范围的过滤器,例如Global范围,controller范围等.以ActionFilter为例,我们来看看过滤 ...

  2. asp.net core mvc 集成miniprofiler

    原文:asp.net core mvc 集成miniprofiler asp.net core mvc 集成miniprofiler 一.环境介绍 二.监控asp.net 页面 三.监控执行的sql语 ...

  3. asp.net core MVC 过滤器之ActionFilter过滤器(二)

    本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter过滤器(一) asp.net core ...

  4. ASP.NET Core MVC请求超时设置解决方案

    设置请求超时解决方案 当进行数据导入时,若导入数据比较大时此时在ASP.NET Core MVC会出现502 bad gateway请求超时情况(目前对于版本1.1有效,2.0未知),此时我们需要在项 ...

  5. 使用 ASP.NET Core MVC 创建 Web API(二)

    使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 六.添加数据库上下文 数据库上下文是使用Entity Framewor ...

  6. 从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板

    标题:从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11155 ...

  7. asp.net core MVC 全局过滤器之ExceptionFilter异常过滤器(一)

    本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter异常过滤器(一) asp.net cor ...

  8. 使用 ASP.NET Core MVC 创建 Web API——响应数据的内容协商(七)

    使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 使用 ASP.NET Core MVC 创建 Web API(二) 使 ...

  9. [ASP.NET Core MVC] 如何实现运行时动态定义Controller类型?

    昨天有个朋友在微信上问我一个问题:他希望通过动态脚本的形式实现对ASP.NET Core MVC应用的扩展,比如在程序运行过程中上传一段C#脚本将其中定义的Controller类型注册到应用中,问我是 ...

随机推荐

  1. SQL Server 表的管理_关于事务的处理的详解(案例代码)

    SQL Server 表的管理_关于事务的处理的详解(案例代码) 一.SQL 事务 1.1SQL 事务 ●事务是在数据库上按照一定的逻辑顺序执行的任务序列,既可以由用户手动执行,也可以由某种数据库程序 ...

  2. Hession集成Spring + maven依赖通讯comm项目 + 解决@ResponseBody中文乱码

    hessian结合spring的demo         hessian的maven依赖: <!-- hessian --> <dependency>         < ...

  3. leetCode刷题(找到最长的回文字符串)

    Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...

  4. mac终端命令及pycharm常用快捷键记录

    mac终端命令: 1.root权限 $sudo su - 2.定位到指定文件夹位置 $cd /Users/计算机名称/Desktop     (定位到桌面) 3.新建文件夹 $mkdir 文件夹名称 ...

  5. 一个基于原生JavaScript开发的、轻量的验证码生成插件

    Vcode.js 一个基于原生JavaScript开发的.轻量的验证码生成插件 V: 1.0.0 DEMO:https://jofunliang.github.io/Vcode.js/example. ...

  6. 深入理解.net - 4.你必须知道的String

    为什么要单独写string,主要是它太常用了,同时又太特殊了,特殊到CLR对它的处理都和其它对象不一样.简直可以称为VIP用户啊.本文并不是一篇介绍如何使用string的文章,而是旨在阐述string ...

  7. Java多线程-概念与原理

    一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在 ...

  8. Linux 普通用户之间免密登陆

    目的: 同台机器之间实现普通用户之间的免密登陆: NN01 的user1 免密登陆 user2 不同机器之间实现普通用户之间的免密登陆 :NN01 的user1 免密登陆 NN01 的user1 一. ...

  9. xcode6.1 设置中文输入

    XCode6.1中设置中文输入方法:Product->scheme->Edit Scheme->Options->Application Region->中国 ios 模 ...

  10. Unity文档阅读 第二章 依赖注入

    Introduction 介绍Chapter 1 outlines how you can address some of the most common requirements in enterp ...