我在将ASP.NET中的Cookie传递给新网址时遇到问题。我像这样在响应中添加cookie:
Response.Cookies.Add(new HttpCookie("Username", Username.Text));
然后我发出重定向:
Response.Redirect(returnURL);
在我重定向到的新页面上,cookie集合为空。我尝试像这样检索一个cookie:
Request.Cookies["Username"].Value;
有人能想到为什么没有传递cookie吗?
修改
更多信息我忘记添加 - 在同一浏览器会话中的第二次尝试中,Cookie正确传递了重定向。
编辑#2:我发现如果我在重定向网址中使用“localhost”而不是实际的域名,那么首次登录时会正确传递Cookie。因此,只有当重定向URL是实际的域名时才会起作用。奇怪。
答案 0 :(得分:5)
浏览器仅将cookie发送回与设置cookie的页面位于同一域中的页面。
因此,如果您转到页面http://localhost/login.aspx
然后服务器继续设置cookie并重定向到(例如)http://mymachinename/default.aspx
,则在请求时不会将cookie从浏览器发送到服务器第二个网址,因为它不在同一个域中。
要恢复Cookie,您必须重定向到http://localhost/default.aspx
,否则您必须从最初转到http://mymachinename/login.aspx
开始。
答案 1 :(得分:4)
根据HTTP State Management Mechanism
Origin服务器可以使用任何
发送Set-Cookie响应头 响应。用户代理可以忽略中包含的Set-Cookie头 具有100级状态代码的响应但必须处理Set-Cookie
其他回复中包含的标题(包括400-
的回复 和500级状态代码)。源服务器可以包括多个
单个响应中的Set-Cookie标头字段。存在一个 Cookie或Set-Cookie标头字段不排除HTTP缓存
存储和重用响应。
所以REDIRECTs(3xx)在“其他”响应中,因此它们应该由浏览器处理,然后可能由于各种原因丢弃它们。浏览器拒绝cookie的一个原因是指定了cookie的domain属性并且没有足够的点(如'localhost')或者cookie的path属性与URL中的实际路径不匹配时(cookie的路径区分大小写)。
答案 2 :(得分:2)
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
if (Request.QueryString["AcceptsCookies"] == null)
{
Response.Cookies["TestCookie"].Value = "ok";
Response.Cookies["TestCookie"].Expires =
DateTime.Now.AddMinutes(1);
Response.Redirect("TestForCookies.aspx?redirect=" +
Server.UrlEncode(Request.Url.ToString()));
}
else
{
Label1.Text = "Accept cookies = " +
Server.UrlEncode(
Request.QueryString["AcceptsCookies"]);
}
}
}
This link将帮助您了解在C#中阅读和编写Cookie。
此外,如果您熟悉VB而不是C#,this page将非常有用。
答案 3 :(得分:1)
我在.NET Core 2.1 WebApp中遇到了同样的问题。经过一会儿的搜索,我发现我可以使用以下命令强制cookie不会在重定向响应时丢失。
HttpContext.Response.Cookies.Append("cookie-name", "cookie-value", new CookieOptions { IsEssential = true });
docs提到此属性“表明此cookie对于应用程序正常运行是否必不可少。如果为true,则可能会绕过同意策略检查。默认值为false。”
这可能是您的选择!
答案 4 :(得分:0)
通常我让我的服务器生成一个我通过ajax检索的Base64字符串。当准备好的物品可用时,我会制作附件'从客户端上的基本64字符串。这样,我可以跨浏览器一致地响应下载完成。
答案 5 :(得分:0)
与我合作的解决方案是使用相对 url 而不是绝对 url 重定向:
如下:
Response.redirect("~/yourRedirectPage.aspx");
代替
responce.redirect("www.yoursite.com/yourRedirectPage.aspx");