假设我想自动从位于需要身份验证的网站内的网址下载文件,我使用基于Internet Explorer的自动WebBrowser控件登录该网站。但是,一旦我在那里并获取文件的链接,如果我尝试通过导航到它直接通过IE6下载它,将会有“你想打开或保存此文件”模式对话框。如果我尝试使用C#WebClient类下载它,它没有成功,所有下载的都是一小段无意义的javascript。事实上,出于好奇,我在Gmail网站上测试了试图下载附件的WebClient方法,但它也没有用(我知道从Gmail我可以通过POP3接口抓取它们,这只是一个实验)。
嗯,所以这让我想知道这一切的潜在机制。首先,也许我以错误的方式使用WebClient?或者在这种情况下可能还有一些其他标准的C#类用于下载文件?
如果没有,应用程序是否可能欺骗浏览器的行为,以便服务器认为文件请求来自它,即使它实际上来自同一进程的另一部分?浏览器在这种情况下究竟做了什么让它下载文件而WebClient无法下载?
答案 0 :(得分:2)
如果您想了解两个网络程序的不同之处,您必须查看网络流量。使用Fiddler或类似的东西来查看每个程序正在做什么,然后比较两个。
答案 1 :(得分:1)
这通常与您的浏览器发送的cookie或其他HTTP请求标头有关。 Web服务器不能区分b / w是人为驱动的Web浏览器,也不能区分代码控制的“webclient”,只要它们发送完全相同的标题即可。
在人工驱动的“会话”身份验证中(输入用户名/密码)通常会导致某些cookie从服务器发送到浏览器,并且您继续“登录”,因为浏览器会在将这些cookie发送回服务器时提出后续要求。
因此,如果您的webclient可以正确发送(发布?)凭据,并继续根据需要存储和重新发送cookie(和/或“referrer”/“user-agent”标题),则不应该是不同(最后它只是请求,以及HTT协议的响应链)。
在您使用的特定“控件”中可能存在保护措施,以防止它(或API)被恶意软件使用。 “一个程序试图代表你发送电子邮件,你确定要允许这个吗?”提示,以及MS Outlook中伴随的5秒延迟就是这样一个例子。因此,如果您使用的特定API具有此类提示/预防措施,您可能无法完全默默地处理事情。