【发布时间】:2016-01-09 00:15:45
【问题描述】:
我正在做一个学校项目,我想从我们的 Windows8.1 设备上通过通用应用查看我们的时间表。这样我就不必每次要查看时都登录。我需要一种方法让我登录到我们学校的网站并让我查看源代码,以便查看课程。
我需要使用 C# 代码登录的网站是here。
源代码如下:
<form method="post" action="/adfs/ls/?SAMLRequest=nZJPb9swDMW/iqF7bMmt11SIU2QZihZosSBxd9hloG1m1WZJriglwT79lD9uM2DrYUeBj3yPP2py%0As9NdskFHypqSiZSzBE1jW2W%2Bl%2Bypuh2N2c10QqC7vJez4J/NEl8Ckk9ioyF5rJQsOCMtkCJpQCNJ%0A38jV7PFB5imXvbPeNrZjyYwInY9Wc2soaHQrdBvV4NPyoWTP3vcks0yrH4Z8aBWmv6D9qQympsug%0A77Mt1kSWJbfWNXgIU7I1dIQsuf9Usm8C4epacH6Zg/iQQ12PEQpx2dQXdcFbhCijBRCpDb41EgW8%0Aj4ZgfMlyLoqR4CN%2BUYmxFFzmeVoU119Zsjgt8VGZI5z3Nq6PIpJ3VbUYLT6vKpZ8GSBHATshlQd3%0Ad87y/cEwAGTTAdfACNvQBPoT1SQ7t3m94%2BmE2B4Yxlt43PlkbnUPTtE%2Bo4ad0kG/5jwXzruYYonr%0A/0q9l62xRQf7t4Q4F41XzfG5jdzslobYf3Odnor/2OKtfP5Zp78B&RelayState=Zadkine" id="MainForm">
<input name="ctl00$ContentPlaceHolder1$UsernameTextBox" type="text" id="ContentPlaceHolder1_UsernameTextBox" />
<input name="ctl00$ContentPlaceHolder1$PasswordTextBox" type="password" id="ContentPlaceHolder1_PasswordTextBox" />
<input type="submit" name="ctl00$ContentPlaceHolder1$SubmitButton" value="Aanmelden" id="ContentPlaceHolder1_SubmitButton" class="Resizable" />
</form>
基本上就是这样。 有一些 __VIEWSTATE 的,但我不知道它们是否重要。
我找到了两种解决方案。
-
Stack Overflow 上的 WebRequest 示例不起作用:/
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://sts.zadkine.nl/adfs/ls/?SAMLRequest=nZJPb9swDMW/iqF7bMmt11SIU2QZihZosSBxd9hloG1m1WZJriglwT79lD9uM2DrYUeBj3yPP2py%0As9NdskFHypqSiZSzBE1jW2W%2Bl%2Bypuh2N2c10QqC7vJez4J/NEl8Ckk9ioyF5rJQsOCMtkCJpQCNJ%0A38jV7PFB5imXvbPeNrZjyYwInY9Wc2soaHQrdBvV4NPyoWTP3vcks0yrH4Z8aBWmv6D9qQympsug%0A77Mt1kSWJbfWNXgIU7I1dIQsuf9Usm8C4epacH6Zg/iQQ12PEQpx2dQXdcFbhCijBRCpDb41EgW8%0Aj4ZgfMlyLoqR4CN%2BUYmxFFzmeVoU119Zsjgt8VGZI5z3Nq6PIpJ3VbUYLT6vKpZ8GSBHATshlQd3%0Ad87y/cEwAGTTAdfACNvQBPoT1SQ7t3m94%2BmE2B4Yxlt43PlkbnUPTtE%2Bo4ad0kG/5jwXzruYYonr%0A/0q9l62xRQf7t4Q4F41XzfG5jdzslobYf3Odnor/2OKtfP5Zp78B&RelayState=Zadkine"); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; using (var requestStream = request.GetRequestStream()) using (var writer = new StreamWriter(requestStream)) { writer.Write("ctl00$ContentPlaceHolder1$UsernameTextBox=" + yourusername + "&ctl00$ContentPlaceHolder1$PasswordTextBox=" + yourpassword); } using (var responseStream = request.GetResponse().GetResponseStream()) using (var reader = new StreamReader(responseStream)) { var result = reader.ReadToEnd(); richTextBox1.Text = result; }
在另一个网站上,如果我尝试此代码,我会收到错误,例如“您必须允许 cookie 登录”。但是在我学校的网站上我没有得到任何信息,甚至没有“密码错误”。 (如果我在浏览器上输入错误的密码,我会收到错误的密码错误。)
- 将表单复制到 .HTML 文件并使用 WebView 通过 JavaScript 登录。如果我尝试这个,我会被重定向到另一个页面并得到一个非常奇怪的错误,比如“无法识别用户 null”。所以这两种解决方案对我不起作用。
那么,问题是,我如何使用 C# 登录到website?
【问题讨论】:
-
使用浏览器控件。
-
我在以前的项目中使用过 WebBrowser 控件-您可以获取文本字段并执行按钮单击以从中登录。
-
很遗憾,Windows 8.1 应用程序不支持 WebBrowser。只有 WebView 而 WebView 没有 GetElementByID() 之类的方法。我认为做到这一点的唯一方法是使用 WebRequest 但我无法让它为此工作。我认为 cookie 是问题所在。
标签: c# html windows forms submit