繁体   English   中英

WebRequest和WebClient-在C#中模仿Ajax帖子

[英]WebRequest and WebClient - Imitate an Ajax post in c#

今天,我遇到了一个有趣而奇怪的问题。 已有的历史-几天前,我写了一种方法,利用Webclient将信息发布到wordpress登录页面,它返回给我一个HTML响应,该响应是“已登录”或“无效凭据”

...
                using (var webClient = new WebClient())
                {

                    var email = ((User)user).email;
                    var password = StringCipher.Decrypt(((User)user).password, CIFFConstants.CryptoKey);
                    webClient.UploadValues($"{host}/bloginternal/wp-login.php", new NameValueCollection()
                            {
                                { "log", email },
                                { "pwd", password
                            }});
                    var message = System.Text.Encoding.Default.GetString(result);
                    LogResponseFromServer(message);
                }...

今天,通过向我返回登录页面本身(似乎没有将log和pwd变量发布到页面上的表单上),也没有尝试提交表单,该方法变得很糟糕。

我认为“好吧,也许WebClient并不是解决这种情况的最佳方法”,并采取了第二种方法使用WebRequest

            var email = ((User) user) + "test";
            var password = StringCipher.Decrypt(((User) user).password, CIFFConstants.CryptoKey);

            var baseAddress = $"{host}/bloginternal/wp-login.php";

            var http = (HttpWebRequest)WebRequest.Create(new Uri(baseAddress));
            http.Accept = "application/json";
            http.ContentType = "application/json";
            http.Method = "POST";

            var parsedContent = new JavaScriptSerializer().Serialize(new { log = email, pwd = password});
            var encoding = new ASCIIEncoding();
            var bytes = encoding.GetBytes(parsedContent);

            var newStream = http.GetRequestStream();
            newStream.Write(bytes, 0, bytes.Length);
            newStream.Close();

            var response = http.GetResponse();

            var stream = response.GetResponseStream();
            var sr = new StreamReader(stream);
            var content = sr.ReadToEnd();

请注意,我在电子邮件后添加了虚假的“测试”,这实际上是出于测试目的,以查看该页面是否会像以前一样向我返回“无效登录”。令我沮丧的是,它仍然仅返回登录页面,该表单为似乎没有提交任何信息。

我试图重现的ajax如下:

$.ajax({
                url: '/bloginternal/wp-login.php',
                data: { log: values.Email, pwd: values.Password },
                type: "POST",
                async: false,
                success: function () {

                }
            }); 

奇怪的是, WebClient解决方案工作得很好,我能够通过检查响应是否返回“已登录”状态或“无效凭据”状态来模仿上面列出的ajax调用。

为什么我要发布的站点仅返回股票登录页面,就像没有提交任何信息一样,原因为何? 我在复制Ajax调用时是否错过了任何可能影响服务器返回给我的东西的东西?

手动登录时,请使用Fiddler之类的工具检查浏览器发送的标头和POST数据,并将其与WebRequest代码发送的内容进行比较。 可能是您需要提交一个User-Agent值,在进行登录尝试之前从登录页面检索一个值,或者进行许多其他操作。 比较时要彻底。

顺便说一句,设置Fiddler时,您可能看不到.NET代码发出的请求。 如果发生这种情况,请参阅此帖子以获取可能的修复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM