mvc .net 中,从服务器端跳转页面有很多方法

有些不会改变浏览器地址栏的地址,这个好理解,mvc本身的机制就是action的名字不一定是view的名字

我们请求的不是文件名,在action中我们可以任意调用其它的action

有些跳转方式,是会改变浏览器地址栏的

webform的开发者常用的跳转方式,直接将js代码返回到客户端,并触发

mvc也可以用,如

return Content("<script language='javascript'>window.open('aaa.aspx');</script>");

这种方法也好理解,但是另一种会改变地址栏的方法:

Redirect

是通过什么方式通知浏览器去重定向地址栏的呢?

这其实是很基础的web开发知识,但是我确实不知道

以RedirectToAction为例,

        <form action="TestRedirect" method="post">
测试跳转
<input type="submit" value="提交" />
</form>
        [HttpPost]
public ActionResult TestRedirect()
{
return RedirectToAction("Contact", "Home");
}

开始以为,是通过底层的方式注入了js,所以查看post返回的信息

response是空的

既然没有人为代码的干预,那可以肯定是浏览器接受到了指令,自动重定向了地址栏

好歹记得headers在服务器端也会变,查看header

  1. Request URL:
    http://localhost:4732/Home/TestRedirect
  2. Request Method:
    POST
  3. Status Code: 
    302 Found
  4. Request Headers
    1. Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    2. Accept-Encoding:gzip,deflate,sdch
    3. Accept-Language:zh-CN,zh;q=0.8
    4. Cache-Control:max-age=0
    5. Connection:keep-alive
    6. Content-Length:0
    7. Content-Type:application/x-www-form-urlencoded
    8. Cookie:account=lizb; Comm=100076; lastpostedforum=3; visitedforums=3,2
    9. Host:localhost:4732
    10. Origin:http://localhost:4732
    11. Referer:http://localhost:4732/Home/About
    12. User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36
  5. Response Headers
    1. Cache-Control:private
    2. Content-Length:130
    3. Content-Type:text/html; charset=utf-8
    4. Date:Tue, 03 Dec 2013 06:54:06 GMT
    5. Location:/Home/Contact
    6. Server:Microsoft-IIS/8.0
    7. X-AspNet-Version:4.0.30319
    8. X-AspNetMvc-Version:4.0
    9. X-Powered-By:ASP.NET
    10. X-SourceFiles:=?UTF-8?B?YzpcdXNlcnNcYWRtaW5pc3RyYXRvclxkb2N1bWVudHNcdmlzdWFsIHN0dWRpbyAyMDEyXFByb2plY3RzXE12YzRMZWFyblxNdmM0TGVhcm5cSG9tZVxUZXN0UmVkaXJlY3Q=?=

发现Request Headers 中,有目标地址。

测试普通post

        [HttpPost]
public ActionResult TestRedirect()
{
return Content("test");
}

结果:

  1. Request URL:
    http://localhost:4732/Home/TestRedirect
  2. Request Method:
    POST
  3. Status Code: 
    200 OK
  4. Request Headersview source
    1. Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    2. Accept-Encoding:gzip,deflate,sdch
    3. Accept-Language:zh-CN,zh;q=0.8
    4. Cache-Control:max-age=0
    5. Connection:keep-alive
    6. Content-Length:0
    7. Content-Type:application/x-www-form-urlencoded
    8. Cookie:account=lizb; Comm=100076; lastpostedforum=3; visitedforums=3,2
    9. Host:localhost:4732
    10. Origin:http://localhost:4732
    11. Referer:http://localhost:4732/Home/About
    12. User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36
  5. Response Headersview source
    1. Cache-Control:private
    2. Content-Encoding:gzip
    3. Content-Length:122
    4. Content-Type:text/html; charset=utf-8
    5. Date:Tue, 03 Dec 2013 07:39:04 GMT
    6. Server:Microsoft-IIS/8.0
    7. Vary:Accept-Encoding
    8. X-AspNet-Version:4.0.30319
    9. X-AspNetMvc-Version:4.0
    10. X-Powered-By:ASP.NET
    11. X-SourceFiles:=?UTF-8?B?YzpcdXNlcnNcYWRtaW5pc3RyYXRvclxkb2N1bWVudHNcdmlzdWFsIHN0dWRpbyAyMDEyXFByb2plY3RzXE12YzRMZWFyblxNdmM0TGVhcm5cSG9tZVxUZXN0UmVkaXJlY3Q=?=

发现没有Location这个参数

猜测是不是有Location浏览器就会自动跳转

        [HttpPost]
public ActionResult TestRedirect()
{
Response.AddHeader("Location", "/Home/Contact");
return Content("test");
}

失败,不会跳转

对比headers,又发现一个差异。Status Code是不一样的

普通的post,Status Code 是 200

redirect post的Status Code: 是 302

测试:

        [HttpPost]
public ActionResult TestRedirect()
{
Response.AddHeader("Location", "/Home/Contact");
Response.StatusCode = 302;
return Content("test");
}

成功跳转,另外如果Location不存在,只修改status,也不会跳转

结论:

Redirect 的原理是通过修改status来通知浏览器来重定向 .

当然,搞明白这个,或许没什么用(用这个方法来跳转页面看起来很诡异,因为貌似不管在哪种架构里都有redirect)

不过至少涨了点zishi,StatusCode 是有很多实际意义的,之前一直不知道

http://www.w3school.com.cn/tags/html_ref_httpmessages.asp

 
												

Redirect 原理的更多相关文章

  1. Response.Redirect原理图解

  2. 重定向(Redirect)相关的几个问题

    转载自:http://hi.baidu.com/fboosjgvuvckore/item/405a1cd7be2c36e3795daa8b 此次挂接用户中心,交互大都通过重定向(Redirect)实现 ...

  3. ASP.NET相关

    1.委托:把一个方法当作参数传到另一个方法中 扩展方法:1.静态类 2.静态方法 3.this关键字 using System; using System.Collections.Generic; u ...

  4. 06 ASP.net

    ASP.net 第一天 理解浏览器与服务器概念,与WinForm的区别. C# IIS(Internet Information Service) 互联网信息服务 Java(Tomcat) Php(A ...

  5. Yii rbac原理和实践

    Yii框架中集成分层的 RBAC,代码位于vendor\yiisoft\yii2\rbac中,rbac工作原理分为两部分,建立授权数据和进行权限检查. 如上,一个角色拥有某个权限,如果希望用户拥有这个 ...

  6. 跟vczh看实例学编译原理——零:序言

    在<如何设计一门语言>里面,我讲了一些语言方面的东西,还有痛快的喷了一些XX粉什么的.不过单纯讲这个也是很无聊的,所以我开了这个<跟vczh看实例学编译原理>系列,意在科普一些 ...

  7. I/O重定向的原理和实现

    在Unix系统中,每个进程都有STDIN.STDOUT和STDERR这3种标准I/O,它们是程序最通用的输入输出方式.几乎所有语言都有相应的标准I/O函数,比如,C语言可以通过scanf从终端输入字符 ...

  8. JAVA常见面试题之Forward和Redirect的区别

    用户向服务器发送了一次HTTP请求,该请求可能会经过多个信息资源处理以后才返回给用户,各个信息资源使用请求转发机制相互转发请求,但是用户是感觉不到请求转发的.根据转发方式的不同,可以区分为直接请求转发 ...

  9. Forward和Redirect的区别

    一:间接请求转发(Redirect) 二:直接请求转发(Forward) 用户向服务器发送了一次HTTP请求,该请求可能会经过多个信息资源处理以后才返回给用户,各个信息资源使用请求转发机制相互转发请求 ...

随机推荐

  1. 移动端动画使用transform提升性能

    在移动端做动画,对性能要求较高而通常的改变margin属性是性能极低的,即使使用绝对定位改变top,left这些属性性能也很差因此应该使用transform来进行动画效果,如transform:tra ...

  2. Java中将16进制字符串转换成汉字

    技术交流群:233513714 /** * 将16进制字符串转换成汉字 * @param str * @return */ public static String deUnicode(String ...

  3. ExtJS布局方式(layout)图文详解

    Auto默认布局 不给下级组件指定大小和位置 Absolute绝对布局 可使用坐标(x.y)进行布局 Accordion手风琴布局 实现Accordion效果的布局,也可叫可折叠布局.也就是说使用该布 ...

  4. ExtJS常用的正则表达式

    正则表达式用于字符串处理.表单验证等场合,实用高效.现将一些常用的表达式收集于此,以备不时之需. Ext.onReady(function(){ Ext.QuickTips.init(); }); E ...

  5. 黑马程序员——JAVA基础之内部类,匿名内部类

    ------- android培训.java培训.期待与您交流! ---------- 内部类 将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类). 内部类访问特点: •  内部 ...

  6. spring beans源码解读之 ioc容器之始祖--DefaultListableBeanFactory

    spring Ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说, DefaultL ...

  7. VC调用系统的调色板

    调用系统的调色板可以用到ChooseColor这个函数,这个函数传入一个参数为CHOOSECOLOR结构体的指针,其函数原型为 BOOL ChooseColor(LPCHOOSECOLOR lpCC) ...

  8. java打包压缩文件

    package com.it.simple.util; import java.io.BufferedOutputStream;import java.io.ByteArrayOutputStream ...

  9. GPU优化方法[转]

    CUDA优化的最终目的是:在最短的时间内,在允许的误差范围内完成给定的计算任务.在这里,“最短的时间”是指整个程序运行的时间,更侧重于计算的吞吐量,而不是单个数据的延迟.在开始考虑使用GPU和CPU协 ...

  10. OpenJudge计算概论-球弹跳高度的计算

    /*======================================================================== 球弹跳高度的计算 总时间限制: 1000ms 内存 ...