【问题标题】:How to get request with JSESSIONID c#?如何使用 JSESSIONID c# 获取请求?
【发布时间】:2018-10-17 16:55:28
【问题描述】:

我遇到了 C# HTTP GET 请求的问题。 我向服务器发送两个请求: 第一个请求返回 JSESSIONID 的值并且它的工作:

private string GetSessionId(){
{
    string id = null;
    try
    {
        var webRequest = WebRequest.Create("http://www.xxxxxxxxxxxxxxx.it/home") as HttpWebRequest;
        var response = "";

        webRequest.Date = DateTime.UtcNow;
        webRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8";
        webRequest.Headers.Add("Accept-Encoding", "gzip, deflate");
        webRequest.Headers.Add("Accept-Language", "it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7,de-DE;q=0.6,de;q=0.5");
        webRequest.Connection = "keep-alive";
        webRequest.Headers.Add("Cache-Control", "max-age=0");
        webRequest.Host = "www.xxxxxxxxxxxxxxxx.it";
        webRequest.Headers.Add("Upgrade-Insecure-Requests", "1");
        webRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36";

        if (webRequest != null)
        {
            webRequest.Method = "GET";
            using (WebResponse resp = webRequest.GetResponse())
            {
                using (Stream s = resp.GetResponseStream())
                {
                    using (StreamReader sr = new StreamReader(s))
                    {
                        id = resp.Headers["Set-Cookie"];
                        response = sr.ReadToEnd();
                        Console.WriteLine("Response1> " + resp.Headers);
                    }
                }
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
    return id;
}

第二个请求应该返回服务器对我的搜索的响应,但它返回错误“302 已临时移动”或“注意会话已过期”。

private void RequestFromServer(string url)
{
    string session = GetSessionId().Split(';')[0];
    Console.WriteLine("Session> {0}",session);

    try
    {
        HttpWebRequest webRequest = WebRequest.Create(url) as HttpWebRequest;
        var response = "";

        if (webRequest != null)
        {
            Uri target = new Uri(url);
            webRequest.Method = "GET";
            webRequest.Timeout = 20000;
            webRequest.Date = DateTime.UtcNow;
            webRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8";
            webRequest.Headers.Add("Accept-Encoding", "gzip, deflate");
            webRequest.Headers.Add("Accept-Language", "it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7,de-DE;q=0.6,de;q=0.5");
            webRequest.Headers.Add("Cache-Control", "max-age=0");
            webRequest.Connection = "keep-alive";
            webRequest.ContentType = "application/x-www-form-urlencoded";
            webRequest.Headers.Add("Cookie", session);
            webRequest.Host = "www.xxxxxxxxxxxxxx.it";
            webRequest.Headers.Add("Origin", "http://www.xxxxxxxxxxxx.it");
            webRequest.Referer = "http://www.xxxxxxxxxxxxxxxx.it/ricerca/atto/contratti/originario?reset=true&normativi=false";
            webRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36";
            webRequest.Headers.Add("Upgrade-Insecure-Requests", "1");

            var res = webRequest.GetResponse();
            using (Stream s = res.GetResponseStream())
            {
                using (StreamReader sr = new StreamReader(s))
                {
                    response = sr.ReadToEnd();
                    Console.Write(res.Headers);
                    Console.WriteLine(response);
                }
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
}

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: c# jsessionid


    【解决方案1】:

    您可能需要的是CookieContainer。而不是

    webRequest.Headers.Add("Cookie", session);
    

    你应该做类似的事情

    webRequest.CookieContainer = new CookieContainer();
    Cookie cookie = new new Cookie("JSESSIONID", yourSessionIdHere);
    // adjust domain accordingly
    cookie.Domain = "www.xxxxxxxxxxxxxxx.it";
    httpRequest.CookieContainer.Add(cookie);
    

    代码未经测试。

    MSDN 网站还指出:

    出于安全原因,默认情况下禁用 cookie。如果要使用 cookie,请使用 CookieContainer 属性启用 cookie。

    这意味着要使用 cookie,您必须明确设置 CookieContainer。

    【讨论】:

    • 感谢您的回答,但此代码返回我解决的异常: webRequest.CookieContainer.Add(new Cookie("JSESSIONID", yourSessionIdHere){ Domain = "www.xxxxxxxxxxx.it" });但这并不能解决我的问题。
    • 我已经编辑了我的答案。根据错误信息(如果我的翻译是正确的),也需要为 cookie 设置域。有关 Cookie 类的更多属性,请参阅Cookie documentation on MSDN
    • 是的,我添加了域,但我的问题没有解决。
    • 这到底是什么意思?是否有其他异常或错误消息?如果有,请发布。
    • 问题始终是第二个请求应该返回服务器对我的搜索的响应,但它返回“注意会话已过期”。
    猜你喜欢
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 2014-08-21
    • 2011-05-11
    相关资源
    最近更新 更多