2016-06-16 5 views
0

私は以下のコードでクライアントにダウンロードをダウンロードするDropbox共有リンクを持っています。URLが存在しない場合にユーザーにメッセージを表示する404 WebClient DownloadFileを使用してファイルをダウンロードするとき

私の問題は、ファイルがDropboxリンクに存在するかどうかをどのように知るかです。私はテストのために2つのリンクを持っています。最初のものはもう共有されていない共有リンクなので、URLにプラグインすると404エラーが返されます。 2番目は有効なリンクで、クライアントPCに正常にダウンロードされます。このリンクはブラウザで直接試すことができます。

私は以下のコードを試しましたが、それでもまだOK状態と壊れたリンクの200状態を返します。

アプリケーションで404のリンクが壊れていることをユーザーに知らせるにはどうすればよいですか?ここで

 //Throws 404 error in browser. Linked was previously shared but now does not exits. 
    string URL = "https://www.dropbox.com/s/t0wnpjojvj6g4dx/Dropbox.pdf?raw=1"; 
     //Valid URL; 
     string URL = "https://www.dropbox.com/s/javzmitc7ae4l6r/Dropbox.pdf?raw=1"; 

     HttpWebResponse response = null; 
      var request = (HttpWebRequest)WebRequest.Create(URL); 
      request.Method = "HEAD"; //Also tried "GET" 


      try 
      { 
       response = (HttpWebResponse)request.GetResponse(); 
       // get the status code 
       HttpStatusCode status = response.StatusCode; //Always returns OK. 

       using (WebClient client = new WebClient()) 
       { 
        client.DownloadFile(URL, location); 
       } 
      } 
      catch (WebException ex) 
      { 
       /* A WebException will be thrown if the status of the response is not `200 OK` */ 
      } 
      finally 
      { 
       // Don't forget to close your response. 
       if (response != null) 
       { 
        response.Close(); 
       } 
      } 

UPDATE 私はそれが働いて、悪いURLのチェックを取得するために何をしたかです。

string contentType = null; 
    if(contentType != "text/html; charset=utf-8") 
    { 
     using (WebClient client = new WebClient()) 
     { 
      client.DownloadFile(URL, location); 
     } 
    } 
    else 
    { 
     //Throw error to user 
    } 
+1

コードをテストしたが、放火犯を見ずに、いくつかの違いがあります。 1つは、悪いリンクは 'text/html'のコンテンツタイプを持ち、有効なリンクはファイルタイプ(' application/pdf')と一致するコンテンツタイプを含んでいます。第2に、無効なリンクがHTMLを返すだけで、有効なリンクは実際のファイルの場所に302を行います。これらの相違点(応答コンテンツタイプを盗聴するか、実際には302の検出方法がわからない)を組み合わせて、有効なファイルを識別する方法を特定するのに役立ちますか? – Tommy

+1

@トミーはそれをしました。アイデアをありがとう。私は自分のコードにContentType = "text/html"を追加して、ファイルをダウンロードしないでください。 – Apollo

+0

驚くばかり! - 私はちょうどコメントのように、おそらく並べ替えの "ハック - ish"の答えとして残すつもりです:) – Tommy

答えて

0

あなたはWebExceptionをスローするか、捕まえなければならないと思います。あなたのweb.configファイルでは、各HTTPエラー

<configuration> 
    <system.webServer> 
     <httpErrors>... 
0

EDITのページを設定することができます - 私の前の回答は404をキャプチャする方法を提案したが、実際には1つはありません。

ここでの問題は、ページが実際には404ではなく200を返すことです。これはDropbox側のバグです。

+0

私は上記のコードでそれを持っています。問題は、GetResponseが404のページであっても例外をスローしないことです。 – Apollo

+0

次に、実際に404を返していません。ビューDropboxがブラウザに表示されているか、404などと表示されますが、レスポンスの実際のステータスコードは言い換えれば、404上に404ステータスコードを実際に戻さない場合は、Dropboxに手を差して解決するように指示するだけです。 –

+0

確認済み:最初のURLのページが実際に200を返しています。 – smarx

0

Webインターフェイス(ユーザーが直接対話するように設計されている)を使用する代わりに、ファイルをダウンロードするためにAPI(プログラムとインターフェイスが直接対話するように設計されている)を使用する必要があります。 According to DropBox、不正なファイルを要求すると、APIは実際に404を返します。 APIリファレンスの

スクリーン・キャプチャー(タイプするロット)

enter image description here

+0

Dropboxが問題を認識しているようです。 APIを使用することはできません。https://www.dropboxforum.com/hc/en-us/community/posts/204362869-How-to-detect-an-invalid-share-URL- – Apollo

+0

これは、ユーザーのアカウントにアクセスしていて、あなたが探していたファイルですが、これは共有リンク経由でダウンロードする際には役に立ちません。 – smarx

+0

十分に公正な - 私はおそらく将来的に更新/ – Tommy

関連する問題