HttpContext.Current.Request.Headers.Keys["CustomeUrl"].ToString() 在您的控制器中始终为 null 的原因是您在视图中将标头添加到 HttpContext.Current.Response 并从控制器中的 HttpContext.Current.Request 读取它。由于视图和控制器都在服务器上执行并共享相同的请求/响应模型,因此您需要从编写它的同一位置读取它。
也就是说,因为视图和控制器都可以访问相同的请求/响应数据。不需要将 HTTP 上下文中已经存在的值传递给控制器,因为它已经有了它。此外,如果 URL 格式错误,UrlReferrer 属性将引发异常(这可能会发生,因为它通常不受您的直接控制)。因此,您应该use the Request.Headers collection to retrieve it。因此,这条线在您的控制器和视图中的工作方式相同。
string referrer = HttpContext.Request.Headers["Referer"];
旁注:您不应该在 MVC 中使用旧的静态 HttpContext.Current 访问器,因为无法抽象它(因此它可能与 HttpContextBase 中可用的访问器不同如果您正在使用更改它的自定义或第 3 方组件)。
仅当在浏览器中单击超链接以将您带到 MVC 应用程序的 URL 时,HTTP referer 才为非空。
A页
托管在:http://example.com/page-a.html
<html>
<head></head>
<body>
<a href="http://example2.com/page-b">click me</a>
</body>
页面 B (MVC)
托管在:http://example2.com/page-b
var referrer = HttpContext.Request.Headers["Referer"];
// referrer value is http://example.com/page-a.html if the above
// hyperlink is clicked on page-a.html. If the user types the
// new URL in the browser instead of clicking the hyperlink,
// HTTP referer will usually be null, depending on the browser implementation.
注意: HTTP 引用完全依赖于客户端以及客户端和服务器之间存在的任何防火墙。一些防火墙可以去除标头,因此应用程序不应该依赖它们来运行(或者至少有一个备用计划,以防标头不可用)。此信息通常应仅用于跟踪/调试目的。