【问题标题】:HttpWebRequest in c#c#中的HttpWebRequest
【发布时间】:2012-12-27 08:36:36
【问题描述】:

我正在使用以下代码发出 Get 请求:

            TheRequest = (HttpWebRequest)WebRequest.Create(aURL);
            TheRequest.Method            = "GET";
            TheRequest.CookieContainer   = TheCookies;
    TheRequest.UserAgent         = GetUserAgent();
    TheRequest.KeepAlive         = false;
    TheRequest.Timeout       = 20000;
            TheRequest.ReadWriteTimeout  = 20000;
    TheRequest.AllowAutoRedirect = true;
    TheRequest.Headers.Add("Accept-Language", "en-us");
            TheResponse = (HttpWebResponse)TheRequest.GetResponse();
            TheResponseString = new StreamReader(TheResponse.GetResponseStream(), Encoding.ASCII).ReadToEnd();

在此之后,我按如下方式获取 cookie:

string theCookieHeader = TheResponse.Headers[HttpResponseHeader.SetCookie];

然后我将字符串处理为正确的 cookie 格式,并将其放入 cookie 容器中,以便在下一个 POST 请求中提供。从响应字符串 (TheResponseString) 我创建正确的 Post 数据和来自 cookiecontainer 的 cookie。

我的POST请求代码如下:

                  TheRequest = (HttpWebRequest)WebRequest.Create(aURL);
                  TheRequest.Method            = "POST";
                  TheRequest.CookieContainer   = TheCookies;
          TheRequest.UserAgent       = GetUserAgent();
          TheRequest.KeepAlive       = false;          
                  TheRequest.Timeout             = 20000;
                  TheRequest.ReadWriteTimeout  = 20000;
          TheRequest.AllowAutoRedirect = true;
          TheRequest.ContentType       = "application/x-www-form-urlencoded";
          TheRequest.Headers.Add("Accept-Language", "en-us"); 
                  byte[] bytes = Encoding.ASCII.GetBytes(aPostDataString);
          TheRequest.ContentLength = bytes.Length;
          Stream oStreamOut = TheRequest.GetRequestStream();
          oStreamOut.Write(bytes,0,bytes.Length);
          oStreamOut.Close();

                  TheResponse = (HttpWebResponse)TheRequest.GetResponse();

                  TheResponseString = new StreamReader(TheResponse.GetResponseStream(),                            Encoding.ASCII).ReadToEnd(); 

现在的问题是我有两个网站,它们是合作伙伴网站,它们的一切都相同(看起来,但如果您有任何疑问,请告诉我),但是对于一个网站它运行良好,而对于另一个网站它提供网站错误页面的响应字符串。

请帮我看看什么来诊断问题。

【问题讨论】:

  • 您需要为第二个提供不同的 cookie,这发生在我身上!即使是同一个网站,但是不同的子域,有时也需要提供不同的cookie
  • 如果您遇到错误,您应该查看失败站点的日志...您应该能够看到为什么您会收到错误。
  • @JonSkeet 我认为他正在尝试连接到无法访问的网站,顺便说一下 Li 请求 :) 我已经安装了 SkeetNotifier,太可爱了!
  • @MSakherSawan:问题是,我们会猜测 - 而 OP 可以确定,如果他可以访问所有日志。是的,OP 需要为不同的站点使用不同的 cookie - 但如果他运行第一个代码 以及 和第二个代码,他应该已经获得了一个新的 cookie。请注意,帖子的命名和缩进有助于...
  • 嘿,我无权访问那里的日志,就 cookie 而言,我发送的 cookie 与我在第一个请求(GET)的响应中获得的 cookie 相同

标签: c# httpwebrequest


【解决方案1】:

我有类似的问题。尝试从请求中保存 cookie,在您得到响应甚至更好之后,将此代码放入 finally 块中。为 TheRequest.Host 运行一次,为第二个站点的主机运行第二次。还要看看你需要http还是https

foreach (Cookie c in TheRequest.CookieContainer.GetCookies(new Uri("http://" + TheRequest.Host)))
{
   TheCookies.SetCookies(new Uri("http://" + TheRequest.Host), c.Name + "=" + c.Value);
}

【讨论】:

  • 我不知道为什么但是 TheRequest.CookieContainer.GetCookies(new Uri("http://" + TheRequest.Host)) 没有返回任何 cookie
  • @user1871770 你确定它是http而不是https吗?您是否尝试使用提琴手来遵循请求?
  • 是的,我做到了,因为在我的问题中,我有两个阶段,你能告诉我把代码放在哪里或者试试你告诉的东西吗?我有 cookie 容器作为类级别的对象。跨度>
  • @user1871770 用 try/catch 包围第一个和第二个块,并将我的代码放入 finally 块中。我不知道你对 TheCookies 做了什么,你初始化了吗?发布更多代码
  • 还有一件事,不要以为我必须从 abc.com 跳到 xyz.com,就像 abc.com 到 abc.com/pqr
猜你喜欢
  • 1970-01-01
  • 2016-12-14
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多