1

プログラムで1つのドキュメントを取得したい公開ウェブサイトがあります。ブラウザで実行すると完全に機能しますが、コードで実行すると「クエリなし」が返されます。

誰かがそれをチェックすることができますか、私は何を間違っているのですか、正直なところ私は数日それに固執しています...

コードは次のとおりです。

string fileUrl = @"http://docsonline.wto.org/imrd/directdoc.asp?DDFDocuments/t/G\SPS\NALB149.doc";
            Uri uri = new Uri(fileUrl);

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);

            using (HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse())
            {

                using (Stream responseStream = webResponse.GetResponseStream())
                {
                    if (responseStream != null)
                    {
                        using (MemoryStream memoryStream = new MemoryStream())
                        {
                            byte[] buffer = new byte[8192];
                            int bytesRead;
                            while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                memoryStream.Write(buffer, 0, bytesRead);
                            }
                            memoryStream.Seek(0, SeekOrigin.Begin);

                            string fileName = fileUrl.Substring(fileUrl.LastIndexOf("/") + 1, fileUrl.Length - fileUrl.LastIndexOf("/") - 1).Replace(@"\", "_");

                            using (FileStream fileStream = System.IO.File.Create(@"C:\temp\" + fileName, (int)memoryStream.Length))
                            {
                                // Fill the bytes[] array with the stream data
                                byte[] bytesInStream = new byte[memoryStream.Length];
                                memoryStream.Read(bytesInStream, 0, (int)memoryStream.Length);

                                // Use FileStream object to write to the specified file
                                fileStream.Write(bytesInStream, 0, bytesInStream.Length);
                            }
                        }
                    }
                }
            }

取得したいファイルへのリンクがあるので、誰か試してみませんか?

多分私よりも幸運があるでしょう...

応答を待っています

4

1 に答える 1

1

OK、ここには2つの問題があります。

  1. リクエストにはCookieコンテナが必要です。

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
    request.CookieContainer = new CookieContainer();
    
  2. パスにはバックスラッシュが含まれており、System.Uriクラスによってエスケープされます。その結果、リクエストが行われdirectdoc.asp?DDFDocuments/t/G%5CSPS%5CNALB149.doc、404エラーにリダイレクトされます。

#2を修正するにはdontEscape、パラメーターをコンストラクターに渡す必要があります。Uri

Uri uri = new Uri(fileUrl, true);

このコンストラクターは、.NET 2.0以降、廃止されたものとしてマークされていますが、引き続き機能します。

これらの変更を行うと、ドキュメントを正常にダウンロードできるようになります。

于 2012-12-06T21:58:38.000 に答える