使用代码C#进行POST不能获得与浏览提交相同的响应

时间:2017-08-02 20:45:30

标签: c# html asp.net httpwebresponse

我需要通过C#代码访问webform。该网页收到一个组合参数(74741432599; 14/01/1970; 1; 3997),重定向到另一个网页,我将在那里搜索一些标签。

如果我使用简单的html表单访问网页,如下面的代码,一切正常。

<html>
    <body>
        <form id="formIntegracaoMatriculaCalouros" name="formIntegracaoMatriculaCalouros" action="http://dsrvwww4/MatriculaCalouros/Seguro/Login.aspx" method="POST">
            <input type='hidden' id='CPFeDataNascimento' name='CPFeDataNascimento' value='74741432599;14/01/1970;1;3997' />
            <input type="submit" name="enviar" />
        </form>
    </body>
</html>

下面,使用fiddler,我得到这个标题:

enter image description here

但不可能手动完成。因此,我们需要自动化此访问,模拟浏览器导航。

下面是我的C#代码来模拟访问:

public static string SendPost(string url, HttpParameters parameters, CookieContainer cookie)
{
    string postdata = parameters != null ? parameters.ToString() : string.Empty;
    byte[] postBytes = Encoding.ASCII.GetBytes(postdata);

    HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
    myRequest.CookieContainer = cookie;
    myRequest.Method = "POST";
    myRequest.ContentType = "application/x-www-form-urlencoded";
    myRequest.ContentLength = postBytes.Length;

    Stream sw = myRequest.GetRequestStream();
    sw.Write(postBytes, 0, postBytes.Length);
    sw.Close();
    WebResponse response = myRequest.GetResponse();
    StreamReader sr = new StreamReader(response.GetResponseStream());

    string responseString = sr.ReadToEnd();

    sr.Close();

    return responseString;
}

它向http://dsrvwww4/MatriculaCalouros/Seguro/Login.aspx发出POST请求。 我的参数是“74741432599; 14/01/1970; 1; 3997”

这是我的小提琴手:

enter image description here

我可以看到Header是不同的,我不知道这是不是问题。我不知道如何通过代码制作相同的标题。

目标网页是一个webform,它在内部使用ajax控件工具包,我知道这是一个很大的麻烦....所以,我需要找到一种方法来获得正确的HTML响应。

以下是我需要通过代码获取的目标页面。

enter image description here

进入此页面后,我需要制作一些剪贴簿,获取一些内容并模拟点击次数。

但是,我的第一个挑战是绕过这一步,这是一个正确的反应。

任何人都知道我做错了什么?有什么提示可以继续前进吗?

好吧,我改进了我的代码,现在,我用这个方法来发帖:

public static string SendPost(string url, HttpParameters parameters, CookieContainer cookie)
{
    string postdata = parameters != null ? parameters.ToString() : string.Empty;
    byte[] postBytes = Encoding.ASCII.GetBytes(postdata);

    HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
    myRequest.CookieContainer = cookie;
    myRequest.Method = "POST";
    myRequest.ContentType = "application/x-www-form-urlencoded";
    myRequest.ContentLength = postBytes.Length;
    myRequest.ProtocolVersion = HttpVersion.Version10;
    myRequest.Accept = "image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, */*";
    myRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; Touch; .NET4.0C; .NET4.0E; Tablet PC 2.0)";
    myRequest.Headers.Add(HttpRequestHeader.Pragma, "no-cache");
    myRequest.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
    myRequest.Headers.Add(HttpRequestHeader.AcceptLanguage, "pt-BR,pt;q=0.5");
    myRequest.Headers.Add(HttpRequestHeader.Cookie, cookie.ToString());
    myRequest.KeepAlive = true;

    Stream sw = myRequest.GetRequestStream();
    sw.Write(postBytes, 0, postBytes.Length);
    sw.Close();
    WebResponse response = myRequest.GetResponse();
    StreamReader sr = new StreamReader(response.GetResponseStream());

    string responseString = sr.ReadToEnd();

    sr.Close();
    response.Close();

    return responseString;
}

现在,我得到了这个标题:

enter image description here

现在几乎一样......除了Cookies值,我不知道如何通过代码发送它。

下面是按表单发布时的提琴手,Cookie突出显示......

enter image description here

当我使用简单表单进行访问时,我们可以看到下一页(重定向)是“/MatriculaCalouros/Default.aspx”,这是我试图通过代码获取的正确页面。

但是,由于某些问题是我的帖子代码,重定向是不同的...我得到的响应来自“/ captacao / matricula”页面,这证明我发错了帖子...这个页面是某种错误...

所以,我想知道我发送的Cookie是不是问题,还是代码还有其他东西需要发送。

2 个答案:

答案 0 :(得分:1)

要使代码中的标题使用HttpWebRequest.Headers集合,请在其中添加标题。

答案 1 :(得分:0)

我最好的客户是从服务器端代码调用静态方法,因为HTML表单不使用服务器端ASP.NET用户控件。尝试添加runat =&#34; server&#34;对你的控件,然后尝试发布并观察标题出现的差异。