【问题标题】:Submit an HTML form submit using C#使用 C# 提交 HTML 表单提交
【发布时间】: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&amp;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 的,但我不知道它们是否重要。

我找到了两种解决方案。

  1. 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 登录”。但是在我学校的网站上我没有得到任何信息,甚至没有“密码错误”。 (如果我在浏览器上输入错误的密码,我会收到错误的密码错误。)

  1. 将表单复制到 .HTML 文件并使用 WebView 通过 JavaScript 登录。如果我尝试这个,我会被重定向到另一个页面并得到一个非常奇怪的错误,比如“无法识别用户 null”。所以这两种解决方案对我不起作用。

那么,问题是,我如何使用 C# 登录到website

【问题讨论】:

  • 使用浏览器控件。
  • 我在以前的项目中使用过 WebBrowser 控件-您可以获取文本字段并执行按钮单击以从中登录。
  • 很遗憾,Windows 8.1 应用程序不支持 WebBrowser。只有 WebView 而 WebView 没有 GetElementByID() 之类的方法。我认为做到这一点的唯一方法是使用 WebRequest 但我无法让它为此工作。我认为 cookie 是问题所在。

标签: c# html windows forms submit


【解决方案1】:

WebBrowser 文档完成事件中的示例代码:

HtmlElement element;
// Filling the username
element = webBrowser.Document.GetElementById("ContentPlaceHolder1_UsernameTextBox");
if (element != null)
{
    element.InnerText = "username";
}


// In case if there is no id of the input field you can get it by name
HtmlElementCollection elements = null;
elements = webBrowser.Document.All.GetElementsByName("pass");
element = elements[0];
element.InnerText = "password";

//login (click)
elements = webBrowser.Document.All.GetElementsByName("submit");
element  = elements[0];
element.InvokeMember("CLICK");

【讨论】:

  • 感谢您的回答,但我需要在 Windows 8.1 应用程序中执行此操作。不幸的是,Windows 8.1 通用应用程序中不存在 WebBrowser。我使用 WebBrowser 和 Forms 完成了相同的过程,但 W8.1 应用程序似乎不同。
猜你喜欢
  • 2013-04-09
  • 2011-03-22
  • 1970-01-01
  • 2013-04-15
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多