具有空域的HttpWebRequest cookie

前端之家收集整理的这篇文章主要介绍了具有空域的HttpWebRequest cookie前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个ASP.NET MVC操作,通过HttpWebRequest向另一个服务器发送GET请求.我想在新的请求中包含原始动作的请求中的所有Cookie.原始请求中的一些System.Web.HttpCookies具有空域值(即“”),这显然不会引起任何问题.当我使用每个这些cookie的名称,值,路径和域创建一个System.Net.Cookie并将其添加到请求的CookieContainer时,我收到此错误

“System.ArgumentException:参数”{0}“不能为空字符串参数名称:cookie.Domain”

这里有一些代码会抛出相同的错误(添加cookie时):

var request = (HttpWebRequest)WebRequest.Create("http://www.whatever.com");
request.Method = "GET";
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add ( new Cookie ( "MyCookieName","MyCookieValue","/","") );

编辑

我通过使用“localhost”作为域来修复它,而不是原始的HttpCookie的空或空字符串值.那么,为什么一个空域不适用于CookieContainer? HttpCookie是否使用空值来表示本地主机,还是需要为此问题找到另一个修复?

解决方法

免责声明:

如前所述,@feroze所说,将cookies的域设置为localhost不会对您有所帮助.我假设你正在编写一个帮助器,允许你将HTTP请求传递到外部域.请注意,这不是最佳实践,并且在很多情况下不需要(即jQuery has a lot of cool cross-domain support built-in,也可以看到新的CORS specification).但有时您可能会遇到这种情况(即,外部资源仅为XML,并且在不支持CORS的服务器上).

Cookie域的背景信息及其工作原理:

如果你还没有看过HTTP Cookie: Domain and Path on Wikipedia – 几乎所有你需要知道的是在那里.

当评估cookie时,客户端(“本地”请求者)和Web服务器(“外部”响应者)都会考虑域和路径.当客户端请求资源时,客户端只应发送cookie,这些Cookie与所请求的URI的域(或更通用的parent domain)和路径(或更通用的父路径)匹配.

Web浏览器正确处理.如果网络浏览器具有域“localhost”的cookie,并且您要求“google.com”,例如,“localhost”域的这些cookie将不会在请求中发送到“google.com”. – 事实上,大多数现代浏览器不会发送它们,他们将完全忽略他们收到的Set-Cookie响应标头(这些称为第三方Cookie – 使您能够接受第三方Cookie网络浏览器是一个巨大的隐私/安全问题 – 不要这样做!)

它在另一个方面也起作用 – 即使客户端不太可能在请求中包含第三方cookie,如果是这样,外部Web服务器应该忽略它(甚至一些用于正确域/路径的cookie),以防止臭名昭着的super-cookie问题(即,托管“example.com”的Web服务器应忽略属于其父域的cookie:“.com”,因为“.com”是“public suffix”)).

你应该做什么[如果你必须]:

我推荐给你的是什么,当你读客户端的cookies(我不是一个MVC的人,但在常规的ASP.NET这将在Request.Cookies),循环通过它们(确保过滤掉您自己的网站的合法Cookie,特别是SessionId等,或者正确使用Path,以至于首先不会将其发送到此页面),然后将它们一次添加到传出请求的cookie集合中,将该域重写为“ www.whatever.com“(根据你的例子 – 如果你动态地这样做,将URL加载到一个新的Uri()对象中,并使用.Host属性),然后将路径设置为”/“. – 这将为外部Web服务器的外发请求构建“Cookie”头.

当该请求返回到您的服务器时,您需要检查它是否为新的Cookie的传入响应 – 这些cookie可以重新打包并以与上一段所示的大致相同的循环类型发送回您的客户端,但您除非’要重写主机为Request.Url.Host – 而您将要将路径设置为“/”,除非您的passthru页面的路径是静态的(我猜这不是因为你是使用MVC),那么你想要将它设置为Request.Url.AbsolutePath.

快乐编码!

编辑:
此外,您将要设置外发请求的X-Forwarded-For标签,以便您所呼叫的网站不会认为您的Web服务器是一个垃圾邮件的单一客户端.

猜你在找的HTML相关文章