gpt4 book ai didi

c# - 为什么 HttpCookieCollection.Get 从手动实例化的对象(而不是当前的 HttpContext)调用时返回 null

转载 作者:太空狗 更新时间:2023-10-29 20:17:20 33 4
gpt4 key购买 nike

HttpCookieCollection.Get MSDN documentation ,据称:

If the named cookie does not exist, this method creates a new cookie with that name.

当从“真实”网络服务器调用 HttpContext.Request.CookiesHttpContext.Response.Cookies 时,这是正确的并且效果很好。

但是,这段代码:

    HttpCookieCollection foo = new HttpCookieCollection();
HttpCookie cookie = foo.Get("foo");
Console.WriteLine(cookie != null);

显示 False(cookie 为空)。

如果 HttpCookieCollection 是从 HTTP 处理程序中的 Request.Cookies 检索到的,则情况并非如此。

知道这里出了什么问题/是否需要任何其他设置?

我问这个是因为我在模拟 HttpContextBase 的地方编写单元测试,所以没有提供“真实”上下文。

谢谢你的帮助

最佳答案

如果您查看 HttpCookieCollection.Get(string) 的代码,您会看到类似这样的内容:

public HttpCookie Get(string name)
{
HttpCookie cookie = (HttpCookie) this.BaseGet(name);
if (cookie == null && this._response != null)
{
cookie = new HttpCookie(name);
this.AddCookie(cookie, true);
this._response.OnCookieAdd(cookie);
}
if (cookie != null)
this.EnsureKeyValidated(name, cookie.Value);
return cookie;
}

它永远不会创建 cookie,因为 _response 将为空(查看第一个“if”语句)。即没有响应对象可以将新 cookie 发回,因此它不会创建它。

响应对象是一个 HttpResponse 对象,它被传递给内部构造函数(因此您无法使用该构造函数)。

我个人从来不喜欢 Get 方法作用于 HttpCookieCollection 的方式;它违反了 Command-Query separation原则:提出问​​题不应改变答案。

我建议您通过检查 AllKeys 属性来检查 cookie 是否存在;如果不存在,则显式创建 cookie 并将其添加到集合中。否则,如果您知道 key 存在,请继续获取现有条目。然后您的生产代码和单元测试应该运行。

创建一个辅助方法或扩展方法来代替 Get 可能是个好主意,以确保无论您是单元测试还是正常运行,它的行为都符合您的预期:

public static class HttpCookieCollectionExtensions
{
public static HttpCookie GetOrCreateCookie(this HttpCookieCollection collection, string name)
{
// Check if the key exists in the cookie collection. We check manually so that the Get
// method doesn't implicitly add the cookie for us if it's not found.
var keyExists = collection.AllKeys.Any(key => string.Equals(name, key, StringComparison.OrdinalIgnoreCase));

if (keyExists) return collection.Get(name);

// The cookie doesn't exist, so add it to the collection.
var cookie = new HttpCookie(name);
collection.Add(cookie);
return cookie;
}
}

关于c# - 为什么 HttpCookieCollection.Get 从手动实例化的对象(而不是当前的 HttpContext)调用时返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16401343/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com