2017-05-29 97 views
0

UrlReferrer总是在Firfox空HttpContext.Current.Request.UrlReferrer总是空ASP.NET MVC

我想要做的是让未来的要求

的URL所以我想传递从Razor视图URL响应头控制器,这样

Razor视图

@{ 
    string url = HttpContext.Current.Request.UrlReferrer.ToString(); 
    HttpContext.Current.Response.Headers.Add("CustomeUrl", url); 
} 

,并得到夏理值像控制器这样

控制器

public string SaveUploadedFile(HttpPostedFileBase fileBase) 
{ 
    string url = HttpContext.Current.Request.Headers.Keys["CustomeUrl"].ToString(); 
} 

但不幸的是,上面的代码没有工作,因为HttpContext.Current.Request.Headers.Keys["CustomeUrl"].ToString();为空

请帮我从查看通过URL的控制器

+0

[Request.UrlReferrer null?]的可能重复(https://stackoverflow.com/questions/149130/request-urlreferrer-null) – hardkoded

回答

0

您不需要经历所有这些麻烦,只需在控制器上使用Request.UrlReferrer即可。

如果它为空,可能会有其他原因。

此外,UrlReferrer是由浏览器发送的,因此毫无意义将其添加到响应中。

1

HttpContext.Current.Request.Headers.Keys["CustomeUrl"].ToString()在您的控制器中始终为空的原因是您将控制器中的标题添加到您的视图中的HttpContext.Current.Response并从HttpContext.Current.Request中读取。同样,由于视图和控制器都在服务器上执行并共享相同的请求/响应模型,因此您需要从您编写它的同一位置读取它。

这就是说,因为View和Controller都可以访问相同的Request/Response数据。不需要将HTTP上下文中已存在的值传递给控制器​​,因为它已经拥有它。另外,如果URL格式不正确(这可能发生,因为它通常不受您的直接控制),则UrlReferrer属性将引发异常。因此,您应该use the Request.Headers collection to retrieve it。因此,这条线在您的控制器和视图中将起到相同的作用。

string referrer = HttpContext.Request.Headers["Referer"]; 

侧面说明:因为没有办法将它抽象(因此它可能是从什么HttpContextBase如果可用不同的,则不应使用MVC中的传统静态的HttpContext.Current访问您正在使用改变它的自定义或第三方组件)。

如果在浏览器中点击一个超链接,HTTP引用程序仅为非null,该超链接会将您引导至MVC应用程序的URL。

网页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引用者完全依赖于客户端和客户端与服务器之间存在的任何防火墙。某些防火墙可以将标题除去,以便应用程序不应该依赖它们来运行(或者至少在头部不可用时有一个后备计划)。这些信息通常只能用于跟踪/调试目的。