【发布时间】:2018-10-11 16:05:43
【问题描述】:
很抱歉打扰您,但是我尝试了一个多星期,没有找到简单有效的方法来实现这个目标,所以我在这里寻求您的帮助。我的工作中有一个经常性的任务,遵循以下步骤:
- 访问我的公司网站;
- 登录;
- 进行搜索;
- 从搜索结果页面下载 KMZ 文件。
我每周都这样做,每次需要下载超过 100 个文件,你知道吗?
我有一个包含我需要的所有结果的列表,所以我在 c# 中创建了一个应用程序来自动化这个过程,但是当文件下载时它不是正确的类型 (KMZ) 并且它的内容是登录页面源代码。发生这种情况是因为我没有正确的文件名,它是由 URL 中的一些参数加载的,例如 https://mycompanywebsite.org/files/fileViewServlet?Parameter1=abx&Parameter2=xyz&Parameter3=123
我就是这么做的。
//Download the file for the returned list
foreach (DataGridViewRow row in dataGridView1.Rows)
{
using (WebClient client = new WebClient())
{
//client.Credentials = new NetworkCredential("username", "password");
String credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes("myusernae" + ":" + "mypassword"));
client.Headers[HttpRequestHeader.Authorization] = $"Basic {credentials}";
try
{
//Download the KMZ
client.Proxy = null;
client.QueryString.Add("parameter1", "value");
client.QueryString.Add("parameter2", "value");
client.QueryString.Add("parameter3", "value");
outputFileName = "File_Name_" + row.Cells["FieldTitle"].Value.ToString() + ".kmz";
client.DownloadFile("https://mycompanywebsite.org/files/fileViewServlet?", strTargetFolder + nomeArquivoEstaca);
}
catch (WebException ex)
{
MessageBox.Show(ex.ToString());
}
}
}
如果您有任何样本可以帮助我实现这一目标,我将不胜感激。
非常感谢。
【问题讨论】:
-
您确定身份验证没有失败吗?基本身份验证是该站点的实际身份验证方法吗?请注意,由于您使用的是
QueryParameters,因此 URI 中的最终?不应该存在。此外,您应该使用NameValueCollection 并将您的参数添加到其中。由于您尝试从同一地址下载更多文件,因此您可以使用WebClient.BaseAddress 功能。 -
我觉得认证没问题。问题是下载的文件。正如我所说,这不是正确的文件。在我登录网站并搜索我需要的内容后手动执行此操作,结果页面会返回一个 ID 号。这个数字用于链接下载我需要的文件。它看起来像这样:cdol.lds.org/cdol/servlet/…(身份证号)。我需要将此 URL 生成的文件保存在我计算机上的预定义文件夹中。你能帮忙编辑我的代码以适应你的建议吗?
-
这不是你写的:文件(...)不正确(...)它的内容是登录页面源代码。您是否返回登录页面,或包含您提到的
ID的页面?如果是登录页面,则认证失败。如果是带有此ID的页面,请提取信息并使用它构建查询。 -
所以,我可以使用 webbrowser 控件进行身份验证,因为我认为身份验证是可以的,但是这里我们使用 WebClient 可能没有进行身份验证。当我单击该链接(手动)时,正在下载 KMZ 文件,但在我的应用程序中下载的是重命名为 KMZ 的登录页面的源代码,而不是我需要的文件,你知道吗?
-
WebBrowser 不是
WebClient。您可以使用 WebBrowser 进行身份验证这一事实与您使用WebClient获得的结果无关。您链接的页面正在使用 Web 表单身份验证。您正在尝试使用basic身份验证登录。这两种方法是完全不兼容的。在 SO/Google 上搜索HttpClient Web Form Authentication。
标签: c# winforms httpwebrequest webclient httpwebresponse