2016-06-16 21 views
0

Ich habe Dropbox shared Links, die mit dem Code unten auf den Client heruntergeladen werden.Anzeige der Nachricht an den Benutzer, wenn die URL nicht existiert 404 beim Herunterladen der Datei mit dem WebClient DownloadFile

Mein Problem ist, wie weiß ich, ob die Datei auf dem Dropbox-Link existiert. Unten habe ich zwei Links zum Testen. Der erste ist ein geteilter Link, der nicht mehr geteilt wird. Wenn Sie ihn also an die URL anschließen, wird ein 404-Fehler zurückgegeben. Der zweite ist ein gültiger Link und es wird auf den Client-PC heruntergeladen. Sie können diese Links direkt im Browser ausprobieren.

Ich habe versucht den Code unten, aber es gibt immer noch einen OK-Status und einen 200-Status für die defekte Verbindung.

Wie kann ich den Benutzer wissen lassen, dass die Verbindung 404 in der Anwendung unterbrochen ist?

 //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 Hier ist, was ich daran zu arbeiten und die Überprüfung für eine schlechte URL bekommen haben.

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

Ohne den Code zu testen, aber bei firebug suchen, gibt es einige Unterschiede. Einer, der schlechte Link hat einen Inhaltstyp von "text/html", während der gültige Link einen Inhaltstyp enthält, der dem Dateityp ("application/pdf") entspricht. Zweitens führt der gültige Link 302 zum tatsächlichen Dateispeicherort, während der ungültige Link nur HTML zurückgibt. Ist eine Kombination dieser Unterschiede (schnüffeln Sie den Inhaltstyp der Antwort oder ich weiß nicht, wie Sie 302 erkennen können) hilfreich, um eine Methode zur Identifizierung einer gültigen Datei zu finden? – Tommy

+1

@Tommy das hat es getan. Danke für die Idee. Ich habe zu meinem Code hinzugefügt, wenn der ContentType = "text/html", dann fahren Sie nicht mit Download der Datei fort. – Apollo

+0

Super! - Ich werde dies als nur einen Kommentar verlassen, da es wahrscheinlich eine Art "hack-ish" Antwort ist :) – Tommy

Antwort

0

Ich denke, Sie müssen eine WebException zu werfen oder zu wiederholen, dass Sie fangen. Meine bisherige Antwort vorgeschlagen, wie die 404 zu erfassen, aber es ist eigentlich nicht ein - in Ihrer web.config können Sie die Seite für jeden http Fehler

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

EDIT konfigurieren.

Das Problem hier ist, dass die Seite tatsächlich eine 200, nicht eine 404 zurückgibt. Ich würde dies einen Fehler auf der Dropbox-Seite betrachten.

+0

Ich habe das im obigen Code. Das Problem ist, dass GetResponse keine Ausnahme auslöst, selbst wenn die Seite 404 ist. – Apollo

+0

Dann gibt es 404 nicht wirklich zurück. Die Ansicht Dropbox zeigt Sie im Browser an oder vielleicht 404, aber der tatsächliche Statuscode der Antwort ist 200. Mit anderen Worten, wenn es nicht wirklich einen 404-Statuscode auf einem 404 zurückgibt, können Sie nur Dropbox kontaktieren und sie bitten, es zu beheben. –

+0

Bestätigt: Die Seite für die erste URL gibt tatsächlich eine 200 zurück. – smarx

0

Anstatt die Webschnittstelle zu verwenden (die für die direkte Interaktion mit Benutzern gedacht ist), sollten Sie die API (für Programme und Schnittstellen zum direkten Interagieren) verwenden, um die Datei herunterzuladen. According to DropBox, gibt die API tatsächlich eine 404 zurück, wenn sie eine ungültige Datei anfordert.

Screenshot der API-Referenz (viel zu geben)

enter image description here

+0

Es scheint, dass Dropbox das Problem kennt. Auch mit der API ist das nicht möglich.https://www.dropboxforum.com/hc/en-us/community/posts/204362869-How-to-detect-an-invalid-share-URL- – Apollo

+0

Dies würde funktionieren, wenn Sie Zugriff auf das Konto des Benutzers und wusste welche Datei Sie gesucht haben, aber das hilft nicht beim Herunterladen über einen Share-Link. – smarx

+0

Fair genug - ich werde das hier lassen, da sie vielleicht in Zukunft aktualisiert/verbessert werden: / – Tommy