我希望我的应用程序从安全网站查询csv文件。我没有网络编程的经验,所以我很欣赏详细的说明。目前我有用户登录该站点,手动查询csv,并让我的应用程序在本地加载该文件。我想通过让用户输入他的登录信息,在网站上验证他,以及查询数据来实现自动化。该应用程序是用C#.NET编写的。
我已经测试了以下代码,并且一旦用户已经对自己进行身份验证并创建了手动查询,就能够访问该文件。
System.Net.WebClient Client = new WebClient();
Stream strm = Client.OpenRead("https://<URL>/file.csv");
以下是发送到站点进行身份验证的请求。我把角度包括在真正的用户名和密码中。
POST /pwdVal.asp HTTP/1.1
Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; Tablet PC 2.0; OfficeLiveConnector.1.4; OfficeLivePatch.1.3; .NET4.0C; .NET4.0E)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Cookie: ASPSESSIONID<unsure if this data contained password info so removed>; ClientId=<username>
Host: www3.emidas.com
Content-Length: 36
Connection: Keep-Alive
Cache-Control: no-cache
Accept-Language: en-US
client_id=<username>&password=<password>
答案 0 :(得分:1)
一旦登录,服务器很可能会发送cookie。您需要提交与登录表单相同的值。 (这可以使用UploadValues()完成)但是,您需要将生成的Cookie保存在CookieContainer中。
当我这样做时,我是使用HttpWebRequest完成的,但是根据http://couldbedone.blogspot.com/2007/08/webclient-handling-cookies.html,您可以继承WebClient并覆盖GetWebRequest()方法以使其支持cookie。
哦,此外,我发现在手动访问网站时使用Fiddler以查看实际来回发送到网站的内容是有用的,所以我知道我想要重现的内容。
编辑,详细请求:我只能详细说明如何使用HttpWebRequest来完成它,我还没有使用WebClient来完成它。以下是我用于登录的代码段。
private CookieContainer _jar = new CookieContainer();
private string _password;
private string _userid;
private string _url;
private string _userAgent;
...
string responseData;
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(_url);
webRequest.CookieContainer = _jar;
webRequest.Method = "POST";
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.UserAgent = _userAgent;
string requestBody = String.Format(
"client_id={0}&password={1}", _userid, _password);
try
{
using (StreamWriter requestWriter = new StreamWriter(webRequest.GetRequestStream()))
{
requestWriter.Write(requestBody);
requestWriter.Close();
using (HttpWebResponse res = (HttpWebResponse)webRequest.GetResponse())
{
using (StreamReader responseReader = new StreamReader(res.GetResponseStream()))
{
responseData = responseReader.ReadToEnd();
responseReader.Close();
if (res.StatusCode != HttpStatusCode.OK)
throw new WebException("Logon failed", null, WebExceptionStatus.Success, res);
}
}
}
答案 1 :(得分:0)
在您离开这个兔子洞之前,请联系该网站并询问他们是否提供了一个Web服务来查询用户帐户信息。您提出的模拟登录方法应该是最后的手段。
答案 2 :(得分:0)
你可以做的另一种方法是自动化IE,例如使用WebBrowser控件。这将更准确地模拟IE运行Javascript的所有聪明的东西,这可能是必要的。虽然如果不需要Javascript或其他聪明的东西,那么使用IE有点笨拙并且可能容易出现其他问题。