Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-连接:HttpWebRequest期间未发送keep-alive标头_C#_Http_Https_Httpwebrequest_Http Headers - Fatal编程技术网

C#-连接:HttpWebRequest期间未发送keep-alive标头

C#-连接:HttpWebRequest期间未发送keep-alive标头,c#,http,https,httpwebrequest,http-headers,C#,Http,Https,Httpwebrequest,Http Headers,我正在尝试发送以下标题和我的HttpWebRequest: 连接:保持活动状态 但是,标题永远不会被发送。Fiddler2显示,每当我在Google Chrome中请求页面时,都会发送标题。但是,由于某些原因,我的应用程序拒绝发送此标头 我已经将KeepAlive属性设置为true(默认情况下它是true),但是头仍然没有被发送 我试图发送多个HttpWebRequests的标题,但它们基本上都是这样的: HttpWebRequest logIn6 = (HttpWebRequest)WebRe

我正在尝试发送以下标题和我的HttpWebRequest:

连接:保持活动状态

但是,标题永远不会被发送。Fiddler2显示,每当我在Google Chrome中请求页面时,都会发送标题。但是,由于某些原因,我的应用程序拒绝发送此标头

我已经将
KeepAlive
属性设置为
true
(默认情况下它是
true
),但是头仍然没有被发送

我试图发送多个HttpWebRequests的标题,但它们基本上都是这样的:

HttpWebRequest logIn6 = (HttpWebRequest)WebRequest.Create(new Uri(responseFromLogIn5));
logIn6.CookieContainer = cookies;
logIn6.KeepAlive = true;
logIn6.Referer = "https://login.yahoo.com/config/login?.src=spt&.intl=us&.lang=en-US&.done=http://football.fantasysports.yahoo.com/";
logIn6.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1";
logIn6.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
logIn6.Headers.Add("Accept-Encoding:gzip,deflate,sdch");
logIn6.Headers.Add("Accept-Language:en-US,en;q=0.8");
logIn6.Headers.Add("Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3");
logIn6.AllowAutoRedirect = false;

HttpWebResponse logIn6Response = (HttpWebResponse)logIn6.GetResponse();
string responseFromLogIn6 = logIn6Response.GetResponseHeader("Location");

cookies.Add(logIn6Response.Cookies);

logIn6Response.Close();
var req = (HttpWebRequest)WebRequest.Create(someUrl);

var sp = req.ServicePoint;
var prop = sp.GetType().GetProperty("HttpBehaviour", 
                        BindingFlags.Instance | BindingFlags.NonPublic);
prop.SetValue(sp, (byte)0, null);

req.GetResponse().Close();
有人知道我必须做什么来确保发送此标头吗

Fiddler2原材料为铬:

GET xxx HTTP/1.1
Host: accounts.google.com
Connection: keep-alive
Referer: https://login.yahoo.com/config/login?.src=spt&.intl=us&.lang=en-US&.done=http://football.fantasysports.yahoo.com/
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: xxx

HTTP/1.1 302 Moved Temporarily
Set-Cookie: xxx
Set-Cookie: xxx
Location: xxx
Content-Type: text/html; charset=UTF-8
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Date: Sat, 17 Sep 2011 22:27:09 GMT
Expires: Sat, 17 Sep 2011 22:27:09 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Content-Length: 2176
Server: GSE
我的应用程序中的Fiddler2 Raw:

GET xxx HTTP/1.1
Referer: https://login.yahoo.com/config/login?.src=spt&.intl=us&.lang=en-US&.done=http://football.fantasysports.yahoo.com/
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Host: accounts.google.com

HTTP/1.1 302 Moved Temporarily
Location: xxx
Content-Type: text/html; charset=UTF-8
Date: Sun, 18 Sep 2011 00:05:40 GMT
Expires: Sun, 18 Sep 2011 00:05:40 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Content-Length: 573
Server: GSE

我正试图让第二个Fiddle2原始信息看起来像第一个Fiddle2原始信息。

你做得对。代码应导致添加以下标题:

Connection: Keep-Alive
如果没有看到此标题,请发布用于从Fiddler发送请求和原始输出的代码。您也可以忽略这一点,因为HTTP 1.1连接不可用


更新:看起来.NET仅为第一个(!)请求显式设置保持活动状态。对同一主机/url的进一步请求将不会有此标头,可能是因为底层tcp连接已被重用。

我遇到了相同的问题:除了第一个请求之外,
连接:保持活动
标头不会发送,如果缺少,我访问的服务器将不会给我正确的响应。因此,以下是我对这个问题的解决方法:

首先,将
HttpWebRequest
实例的
ProtocolVersion
属性设置为
HttpVersion.Version10
。除了http命令将变成
GET xxx http/1.0
,它可以工作并且只使用公共API

第二种方法使用反射来修改
HttpWebRequest
实例的内部属性
ServicePoint.httpbehavior
,如下所示:

HttpWebRequest logIn6 = (HttpWebRequest)WebRequest.Create(new Uri(responseFromLogIn5));
logIn6.CookieContainer = cookies;
logIn6.KeepAlive = true;
logIn6.Referer = "https://login.yahoo.com/config/login?.src=spt&.intl=us&.lang=en-US&.done=http://football.fantasysports.yahoo.com/";
logIn6.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1";
logIn6.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
logIn6.Headers.Add("Accept-Encoding:gzip,deflate,sdch");
logIn6.Headers.Add("Accept-Language:en-US,en;q=0.8");
logIn6.Headers.Add("Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3");
logIn6.AllowAutoRedirect = false;

HttpWebResponse logIn6Response = (HttpWebResponse)logIn6.GetResponse();
string responseFromLogIn6 = logIn6Response.GetResponseHeader("Location");

cookies.Add(logIn6Response.Cookies);

logIn6Response.Close();
var req = (HttpWebRequest)WebRequest.Create(someUrl);

var sp = req.ServicePoint;
var prop = sp.GetType().GetProperty("HttpBehaviour", 
                        BindingFlags.Instance | BindingFlags.NonPublic);
prop.SetValue(sp, (byte)0, null);

req.GetResponse().Close();

希望这能有所帮助。

下载
HttpWebRequest
源代码后,注意到每个属性都会检查一些已知的头,以查找
HeaderCollection
。为了摆脱这些,在那个集合上做一些反思,让它发挥作用

var webRequest = (HttpWebRequest) WebRequest.Create(url);
webRequest.Headers.GetType().InvokeMember("ChangeInternal",
    BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod,
    Type.DefaultBinder, webRequest.Headers, new object[] {name, value}
);

我为这个问题挣扎了半天!亲爱的老提琴手(我的守护天使)是问题的一部分:

每当我在上使用Fiddler监控测试我的HTTP帖子时,问题就没有出现 每当我在关闭Fiddler监控的情况下测试HTTP帖子时,问题就出现了

我的帖子是按照协议1.1发送的,在初始连接后,Keep Alive被忽略/冗余/为什么。i、 我可以在第一篇文章的标题中看到它(通过Fiddler!),但在随后的文章中看不到,尽管使用了相同的代码。嘿嘿

但远程服务器只有在发送Keep Alive时才会响应。现在我无法证明这一点,但我怀疑Fiddler监视连接导致远程服务器认为或相信连接仍然处于活动状态(尽管在我第一篇帖子之后没有发送任何保留信息),并且正确响应。正如我所说的,在我关闭Fiddler的那一刻,由于缺少Keep Alives,远程服务器在我身上超时


我实现了上面描述的1.0解决方案,我的帖子现在可以工作了,无论是否打开或关闭Fiddler。希望这能帮助其他陷入困境的人…

我知道答案,因为我遇到了同样的问题,并通过继承webclient并重写它的Get-Web请求方法解决了这个问题

请参阅下面的代码:

    public class CookieAwareWebClient : WebClient
{
    public CookieContainer CookieContainer { get; set; }

    public CookieAwareWebClient()
        : this(new CookieContainer())
    { }

    public CookieAwareWebClient(CookieContainer c)
    {
        this.CookieContainer = c;
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        var castRequest = request as HttpWebRequest;

        if (castRequest != null)
        {
            castRequest.KeepAlive = true; //<-- this what you want! The rest you don't need. 
            castRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
            castRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36";
            castRequest.Referer = "https://www.jobserve.com/gb/en/Candidate/Login.aspx?url=48BB4C724EA6A1F2CADF4243A0D73C13225717A29AE8DAD6913D";
            castRequest.Headers.Add("Accept-Encoding", "gzip,deflate,sdch");
            castRequest.Headers.Add("Accept-Language", "en-GB,en-US;q=0.8,en;q=0.6");
            castRequest.CookieContainer = this.CookieContainer;
        }

        return request;
    }
}
公共类CookieAwareWebClient:WebClient
{
公共CookieContainer CookieContainer{get;set;}
公共CookieAwareWebClient()
:此(新CookieContainer())
{ }
公共CookieAwareWebClient(CookieContainer c)
{
this.CookieContainer=c;
}
受保护的覆盖WebRequest GetWebRequest(Uri地址)
{
WebRequest=base.GetWebRequest(地址);
var castRequest=作为HttpWebRequest的请求;
if(castRequest!=null)
{

castRequest.KeepAlive=true;//查看上次更新。检查第一个请求是否保持活动状态,后续请求是否保持活动状态。啊,这是有道理的。我的第一个连接确实发送了头。对不起,我应该提到这一点。但是,我没有向同一主机/url发出进一步的请求。而且,在第一个
保持活动状态
头是ent,我得到了这个响应头:
连接:close
。这不是意味着TCP连接被关闭了吗?好的。这是有效的,尽管我一直觉得这是对一些愚蠢的.net错误的修复。非常感谢!我浪费了一天的时间试图修复HttpWebRequest的问题!Http 1.1自动使用Keep alive,所以我认为Keep alive头er是多余的。HttpWebRequest确实发送Connection:close命令来显式关闭连接。Keep-Alive标头不是多余的,因为它控制持久连接上的超时和请求数参数。如果设置Keep-Alive,则连接也应设置为Keep-Alive,否则参数将被忽略显然,
HttpWebRequest
无法直接将这些头设置为正确的值-他们将KeepAlive设置为bool(这是不应该的),设置连接只会引发一个异常。Microsoft彻底破坏了这一点。这不起作用。在代码中设置断点,您将看到“.KeepAlive”属性已为true,但Conction:Keep Alive未随请求一起发送。此博客文章解释了Fiddler如何修复该行为: