1

我是 plumtree 的新手,我正在尝试了解 Plumtree 对象模型。我正在尝试以编程方式从 plumtree 知识目录下载文件。

这是我正在使用的代码:

IRemoteSession session = RemoteSessionFactory.GetExplicitLoginContext(new Uri(url), userName, password);

IDocumentFolderManager DocFolderManager = session.GetDocumentFolderManager();
IDocumentManager DocManager = session.GetDocumentManager();
IObjectQuery FolderQuery = DocFolderManager.GetSubFolders(folderID);
IDocumentQuery DocQuery = DocManager.CreateQuery(FolderQuery.GetRow(i).GetID());
IObjectQuery DocumentQuery = DocQuery.Execute();
IObjectQueryRow document = DocumentQuery.GetRow(1);
IDocumentProperties _docProperties = DocManager.QueryDocumentProperties(document.GetID());
string docUrl = _docProperties.GetStringValue(5);

WebClient webclient = new WebClient();
webclient.Credentials = new System.Net.NetworkCredential(userName, password, "");
webclient.Credentials = CredentialCache.DefaultCredentials;
webclient.DownloadFile(docUrl, "c:\1");

但是我的会话创建代码似乎存在一些问题,因为此代码不是下载实际文件,而是将 Plumtree 登录页面下载到我的文件系统。

有人可以告诉我我在这里做错了什么吗?一定有我想念的东西

4

1 回答 1

1

问题是您的 webclient 实例不知道如何对 plumtree 服务器进行身份验证。new NetowrkCredential() 或 CredentialCache.DefaultCredentials 在简单的情况下有效,但显然不适用于这种情况。

Plumtree 要么使用 cookie,要么(更有可能)使用通过调用 GetExplicitLoginContext() 获得的特定登录令牌,然后与该会话中的所有后续请求一起发送。

您可能会使用 WebClient 伪造这个“与所有后续请求一起发送”,但您需要了解有关 Plumtree 服务器如何验证客户端的更多技术细节。您可以使用Fiddler找出其中的一些信息,但更简单的方法可能是找到一个 plumtree 提供的 API 来下载以前上传到 Plumtree 的文件。

解决此问题的另一种(hacky)方法是伪造浏览器客户端。在上面提出你的请求,然后解析 HTML,提取登录表单的操作 URL,然后伪造一个 HttpWebRequest 调用,它看起来像一个真正的客户端填写登录表单。您需要使用 CookieContainer 来确保发送 cookie、确保标头正确等。请参阅http://channel9.msdn.com/forums/TechOff/162017-Using-WebClient-to-enter-Form- based-Auth-system-How/了解更多信息。

于 2009-09-22T18:10:11.490 回答