Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.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#:将登录数据发布到表单并处理网站';s的反应_C#_Forms_Post_Webrequest_Webresponse - Fatal编程技术网

C#:将登录数据发布到表单并处理网站';s的反应

C#:将登录数据发布到表单并处理网站';s的反应,c#,forms,post,webrequest,webresponse,C#,Forms,Post,Webrequest,Webresponse,我正试图写一个C#程序来延长我在我大学图书馆的书的最后期限。我想做的是: 1.)通过WebRequest&POST方法登录图书馆网站,在C#program中输入用户名和密码 2.)获取“查看借阅图书”网站的url,该网站包含加密密码和纯文本用户名作为Get参数 3.)下载命名页面的内容以在C#程序中显示给用户 4.)如果用户按下程序中的相应按钮,请向网站提交延长表,以立即延长所有媒体 现在我被困在1和2之间,我似乎能够连接到网站并输入用户数据,但我得到的网络响应仍然是登录页面(如果您手动登录网站

我正试图写一个C#程序来延长我在我大学图书馆的书的最后期限。我想做的是: 1.)通过WebRequest&POST方法登录图书馆网站,在C#program中输入用户名和密码 2.)获取“查看借阅图书”网站的url,该网站包含加密密码和纯文本用户名作为Get参数 3.)下载命名页面的内容以在C#程序中显示给用户 4.)如果用户按下程序中的相应按钮,请向网站提交延长表,以立即延长所有媒体

现在我被困在1和2之间,我似乎能够连接到网站并输入用户数据,但我得到的网络响应仍然是登录页面(如果您手动登录网站,则情况并非如此)

这是我编写的连接网站的方法:

// Login function, logs the user in, uses passed user number & password
    public static Boolean userLogin(String unr, String pass)
    {
        // Login
        // Cookie needed for maintaining php session
        CookieContainer cContainer = new CookieContainer();
        Console.WriteLine(unr+","+pass);
        String postUrl = "https://universitylibrary.com/loan/DB=4/LNG=DU/USERINFO_LOGIN";
        String formParams = String.Format("ACT={0}&HOST_NAME={1}&HOST_PORT={2}&HOST_SCRIPT={3}&LOGIN={4}&STATUS={5}&BOR_U={6}&BOR_PW={7}","UI_DATA","","","","KNOWNUSER","HML_OK", unr, pass);
        String cookieHeader;
        WebRequest wreq = WebRequest.Create(postUrl);
        wreq.ContentType = "application/x-www-form-urlencoded";
        wreq.Method = "POST";
        byte[] bytes = Encoding.ASCII.GetBytes(formParams);
        wreq.ContentLength = bytes.Length;
        using (Stream os = wreq.GetRequestStream())
        {
            os.Write(bytes, 0, bytes.Length);
        }
        WebResponse resp = wreq.GetResponse();
        cookieHeader = resp.Headers["Set-cookie"];

        //Authentication trial
        String PageSource;
        String getUrl = "https://universitylibrary.com:443/loan/DB=4/USERINFO";
        WebRequest getReq = WebRequest.Create(getUrl);
        getReq.Headers.Add("Cookie",cookieHeader);
        WebResponse getResp = getReq.GetResponse();
        using (StreamReader sr = new StreamReader(getResp.GetResponseStream()))
        {
            PageSource = sr.ReadToEnd();
        }
        Console.Write(PageSource);
        return true;
    }
你能看出我的错误吗?我在控制台上获得源代码和参数(用户名、密码)输出,但输出仍然是登录页面。 我只想看看php页面,但我没有访问任何内部系统数据的权限,我只有HTML页面

如有任何建议,将不胜感激

编辑:

我重新考虑了整个过程,并完全按照fiddler的记录重新构建了HTTP请求头。该函数的该部分现在如下所示:

 // Login
        // Cookie needed for maintaining php session
        CookieContainer cContainer = new CookieContainer();
        HttpCookie cookie = new HttpCookie("cookie", "PSC_4='xxxxxxx'; DB='n'");
        CookieCollection cookieCol = new CookieCollection();
        cookieCol.Add(cookieCol);
        cContainer.Add(cookieCol);
        Console.WriteLine(unr+","+pass);
        String postUrl = "https://universitylibrary.com:443/loan/DB=4/USERINFO";
        String formParams = String.Format("ACT={0}&HOST_NAME={1}&HOST_PORT={2}&HOST_SCRIPT={3}&LOGIN={4}&STATUS={5}&BOR_U={6}&BOR_PW={7}","UI_DATA","","","","KNOWNUSER","HML_OK", unr, pass);
        String cookieHeader;
        HttpWebRequest wreq = (HttpWebRequest) WebRequest.Create(postUrl);
        wreq.Referer = "https://universitylibrary.com/loan/DB=4/LNG=DU/USERINFO_LOGIN";
        wreq.KeepAlive = true;
        wreq.ContentLength = 119;
        wreq.Host = "universitylibrary.com";
        wreq.ContentType = "application/x-www-form-urlencoded";
        wreq.Method = "POST";
        wreq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0";
        wreq.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        wreq.SendChunked = true;
        wreq.TransferEncoding = "gzip, deflate";
        byte[] bytes = Encoding.ASCII.GetBytes(formParams);
        wreq.ContentLength = bytes.Length;
        using (Stream os = wreq.GetRequestStream())
        {
            os.Write(bytes, 0, bytes.Length);
        }
        cookieHeader = "";
        try
        {
            HttpWebResponse resp = (HttpWebResponse) wreq.GetResponse();
            cookieHeader = resp.Headers["Set-cookie"];
        }
        catch (WebException ex)
        {
            Console.WriteLine(ex.Status);
            Console.WriteLine(ex.Response);
        }
尽管如此,整个事情还是不起作用,和以前一样。
HttpWebRequest是否可能无法处理https,或者https是否缺少其他功能?(HTTP和HTTPS在语法上似乎相同,端口正确设置为443,真正的区别似乎在于额外的SSL/TLS层,也许我需要在某个地方添加它?

您可以在检查登录数据后修改登录页面,并使唯一的输出为“SuccessfullySignIn”,例如。 如果这是您收到的数据, $if(getReq==“SuccessfullySignIn”) { //做点什么 }
并尝试在您的网页中使用重定向功能

当您返回登录页面时,这可能意味着您尚未正确验证。这可能有几个原因,但最终是因为您没有正确地从网站上的手动登录镜像HTTP通信


我通常会使用诸如Fiddler之类的监视器从手动登录中捕获完整的请求/响应模式,然后我可以将其镜像到我的代码中。

他没有访问登录页面的权限。如果我有权访问我发送POST数据的网站,我可以,但是我不知道。你有多确定你发送的POST变量是正确的?您是否尝试过使用类似Fiddler的工具来检查传出的HTTP请求?非常确定,我刚刚检查了Fiddler日志,发送的参数与我指定的参数完全相同。但浏览器似乎传递了一个cookie(尽管响应中没有),正如Fiddler告诉我的那样:“请求发送了69字节的cookie数据:”只是尝试用我的程序传递来自Fiddler的cookie内容,添加:String cookieContent=“cookiecontent1='1';cookiecontent2='2';wreq.Headers[“Cookie”]=cookieContent;但这并没有改变任何事情,似乎仍然缺少HTTP的某些部分。谢谢你的回答!这样做后,我发现我的POST参数似乎完全正确,但传递了一个额外的cookie,我添加了它(参见上面的POST),但这并没有改变任何事情。您是否有其他想法,我可能会搞乱HTTP通信的哪些部分,以及如何检查它们?