我想做一个类似火车票查询的小工具。首先就是,如何向网页www.12306.com发送数据,数据包含(始发站,目的地,时间),有这方面的什么资料吗?

2011-01-12 21:29:54

4 Answers

建议使用HttpWebRequest和HttpWebResponse来做GET和POST,这样效率会好一些(因为没有额外无用的GET)。
至于该POST那些数据,可以使用HttpWatch来查看

2011-01-12 23:40:01

原理是,利用winfrom模拟表单提交数据,将要提交的参数提交给网页,网页执行代码,得到数据,然后Winform程序将网页的所有源代码读取下来,这样就达到windows应用程序和web应用程序之间传参和现实数据的效果了

2011-01-13 01:27:07

首先创建一个windows应用程序和web应用程序。


   在web应用程序中,将网页切换到源代码并把源代码中一些没用的代码删掉,只保留头部,在windows应用程序读取网页源码时,这些都会被一起读下来,但这些都是没用的数据,而且删掉没什么影响。需要保留的代码如下:


<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>


然后在Page_Load中实现功能,以下为一个将两个数相加并将和返回给winform的网页例子。


string A = Request.Form["a"].ToString();//由winform中传给网页的参数用a标识


string B = Request.Form["b"].ToString();


int C = Convert.ToInt32(A) + Convert.ToInt32(B);


Response.Write(C.ToString());//将数据写到网页中


在winform中实现传参的例子代码如下:


private void button1_Click(object sender, EventArgs e)


       {


           WebClient w = new WebClient();


           System.Collections.Specialized.NameValueCollection VarPost = new System.Collections.Specialized.NameValueCollection();


           VarPost.Add("a", textBox1.Text.Trim());//将textBox1中的数据变为用a标识的参数,并用POST传值方式传给网页


           VarPost.Add("b", textBox2.Text.Trim());


//将参数列表VarPost中的所有数据用POST传值的方式传给http://申请好的域名或用IIs配置好的地址/Default.aspx,


//并将从网页上返回的数据以字节流存放到byRemoteInfo中)(注:IIS配置的时候经常没配置好会提示错误,嘿)            


byte[] byRemoteInfo = w.UploadValues("http://申请好的域名或用IIs配置好的地址/Default.aspx", "POST", VarPost);


string sRemoteInfo = System.Text.Encoding.UTF8.GetString(byRemoteInfo);


label1.Text = sRemoteInfo;


        }


这样就实现了C# Winform利用POST传值方式模拟表单提交数据,在这仅供大家参考。

2011-01-13 02:46:46

1.需要模拟SSL加密登录这个过程。
2.需要Cookie对象。
其他就没什么了,根据监控软件的数据模拟request就可以了

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net; using System.IO; using System.Security.Cryptography.X509Certificates; using System.Net.Security; using System.Text.RegularExpressions; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } /// /// 使用WebRequest?接之前?用此方法就可以了. /// private void MethodToAccessSSL() { // ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate); //WebRequest myRequest = WebRequest.Create(url); } // The following method is invoked by the RemoteCertificateValidationDelegate. public static bool ValidateServerCertificate( object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { if (sslPolicyErrors == SslPolicyErrors.None) return true; Console.WriteLine("Certificate error: {0}", sslPolicyErrors); // Do not allow this client to communicate with unauthenticated servers. return true; } private void button1_Click(object sender, EventArgs e) { this.MethodToAccessSSL(); string URL = "https://dynamic.12306.cn/otsweb/passCodeAction.do?rand=lrand"; HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(URL); webRequest.CookieContainer = this.cc; WebResponse response = webRequest.GetResponse(); Stream s = response.GetResponseStream(); this.pictureBox1.Image = Image.FromStream(s); response.Close(); } private CookieContainer cc = new CookieContainer(); private void button2_Click(object sender, EventArgs e) { this.richTextBox1.Clear(); this.tryLogin(); } private void tryLogin() { string content = this.login(); Regex reg = new Regex("当前??用??多,?稍后重?!"); if (reg.Match(content).Success) { this.tryLogin(); } else { this.richTextBox1.Text = content; } } private string login() { this.MethodToAccessSSL(); string url = "https://dynamic.12306.cn/otsweb/loginAction.do?method=login"; HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded"; req.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*"; req.Referer = "https://dynamic.12306.cn/otsweb/loginAction.do?method=init"; req.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E; BRI/2; InfoPath.2; BO1IE8_v1;ENUS)"; req.Host = "dynamic.12306.cn"; req.KeepAlive = true; req.CookieContainer = cc; byte[] sendData = null; sendData = Encoding.Default.GetBytes("loginUser.user_name=xxxx&nameErrorFocus=&user.password=Xxxxxx&passwordErrorFocus=&randCode=" + this.textBox1.Text + "&randErrorFocus="); req.ContentLength = sendData.Length; Stream reqStream = req.GetRequestStream(); reqStream.Write(sendData, 0, sendData.Length); reqStream.Close(); WebResponse res = req.GetResponse(); Stream s = res.GetResponseStream(); string content = new StreamReader(s).ReadToEnd(); //this.webBrowser1.DocumentText = content; res.Close(); return content; } private void Form1_Load(object sender, EventArgs e) { this.MethodToAccessSSL(); string url = "https://dynamic.12306.cn/otsweb/"; HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); webRequest.CookieContainer = this.cc; WebResponse response = webRequest.GetResponse(); Stream s = response.GetResponseStream(); //this.pictureBox1.Image = Image.FromStream(s); response.Close(); //Cookie co = new Cookie(); //co.Name = "BIGipServerotsweb"; //co.Value = "2700542218.36895.0000"; //co.Path = "/"; //co.Domain = "dynamic.12306.cn"; //this.cc.Add(co); //co = new Cookie(); //co.Name = "JSESSIONID"; //co.Value = "8FD1A56E8D082E10D5BCED8ABB013C32"; //co.Path = "/otsweb"; //co.Domain = "dynamic.12306.cn"; //this.cc.Add(co); } } }

2011-01-13 03:45:34
您不能回答该问题或者回答已经关闭!

相关文章推荐

  • C#中using指令的几种用法

    using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到

  • C#实例解析适配器设计模式

    将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作

  • 使用托管C++粘合C#和C++代码(二)

    本文实现一下C++代码调用C#代码的过程。我构造一个简单并且直观的例子:通过C++ UI 触发C# UI.

  • C#开发高性能Log Help类设计开发

    项目中要在操作数据库的异常处理中加入写Log日志,对于商业上有要求,写log时对其它操作尽可能影响小,不能因为加入log导致耗时太多

  • Async和Await使异步编程更简单

    C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作

  • C#开发中的反射机制

    反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等

  • C#运行时相互关系

    C#运行时相互关系,包括运行时类型、对象、线程栈和托管堆之间的相互关系,静态方法、实例方法和虚方法的区别等等

  • C#协变和逆变

    “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型,“逆变”则是指能够使用派生程度更小的类型

  • C#基础概念之延迟加载

    延迟加载(lazy load)是Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作

  • 使用托管C++粘合C#和C++代码(一)

    C#在xml读写,数据库操纵,界面构造等很多方面性能卓越;C++的效率高,是底层开发的必备武器

  • C#中的索引器的简单理解和用法

    C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作

  • 深入C# 序列化(Serialize)、反序列化(Deserialize)

    C#中的序列化和反序列化,序列化是.NET运行时环境用来支持用户定义类型的流化的机制