1

私はプラムツリーを初めて使用し、プラムツリー オブジェクト モデルを理解しようとしています。プラムツリー ナレッジ ディレクトリからプログラムでファイルをダウンロードしようとしています。

これは私が使用しているコードです:

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 インスタンスがプラムツリー サーバーに対して認証する方法を認識していないことです。new NetowrkCredential() または CredentialCache.DefaultCredentials は単純なケースでは機能しますが、明らかにこのケースでは機能しません。

Plumtree は、Cookie を使用するか、GetExplicitLoginContext() への呼び出しを介して取得された特定のログイン トークンを使用し、そのセッションで後続のすべてのリクエストと共に送信されます。

WebClient を使用して、これを「後続のすべてのリクエストと一緒に送信」する可能性がありますが、プラムツリー サーバーがクライアントを認証する方法に関する技術的な詳細を知る必要があります。この情報の一部はFiddlerを使用して把握できますが、より簡単な方法は、以前に Plumtree にアップロードされたファイルをダウンロードするために、plumtree が提供する API を見つけることです。

これにアプローチするもう 1 つの (ハックな) 方法は、ブラウザー クライアントを偽装することです。上記のリクエストを作成し、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 に答える