2016-06-23 5 views
-5

verwenden Ich habe Probleme, meinen Code zu arbeiten. Ich muss auf eine Website zugreifen, die nur eine Textzeile enthält, und sie innerhalb einer cmd-Eingabeaufforderung anzeigen. Die Website ist passwortgeschützt, daher verwende ich den webClient zum Speichern von Cookies und versuche herauszufinden, wie der Benutzername und das Passwort eingegeben werden. Die "using" -Anweisung funktioniert nicht, weiß jemand, was ich stattdessen versuchen könnte?Was könnte ich anstelle der Anweisung "using" in C#

using System; 
using System.Net; 

namespace Temperature 
{ 
    public class CookieAwareWebClient : WebClient 
    { 
     public CookieContainer m_container = new CookieContainer(); 

     protected override WebRequest GetWebRequest(Uri address) 
     { 
      WebRequest request = base.GetWebRequest(address); 
      if (request is HttpWebRequest) 
      { 
       (request as HttpWebRequest).CookieContainer = m_container; 
     } 
     return request; 
     } 

     using (var client = new CookieAwareWebClient()); 
     var values = new NameValueCollection 
     { 
      {"username", "admin"}, 
      {"password","secret"}, 
     }; 
    client.UpLoadValues("http://10.10.1.52:8001/get?OID4.3.2.1=", values); 

    string tempString = client.DownloadString("http://10.10.1.52:8001/get?OID4.3.2.1="); 
    Stream response = myClient.OpenRead("http://10.10.1.52:8001/get?OID4.3.2.1="); 
    Console.WriteLine(tempString); 
    } 
} 
+0

ist dies Ihr echter Code? –

+5

Sie könnten versuchen, die using-Anweisung korrekt zu verwenden? – TZHX

+2

Verwenden Sie für jedes Sprachkonstrukt, das sie bereitstellt und den Code korrekt einrücken, immer Klammern. – Filburt

Antwort

9

Sie verwenden den Block using nicht korrekt. Dies:

using (var client = new CookieAwareWebClient()); 

ist im Grunde das gleiche wie folgt aus:

using (var client = new CookieAwareWebClient()) 
{ 
} 

Sie die Variable erstellen, aber dann tun nichts mit ihm im Codeblock. Es fällt also sofort außer Reichweite.

Ihren Code in das Code-Block verschieben

die Variable, die Sie erstellt zu verwenden:

using (var client = new CookieAwareWebClient()) 
{ 
    var values = new NameValueCollection 
    { 
     {"username", "admin"}, 
     {"password","secret"}, 
    }; 
    client.UpLoadValues("http://10.10.1.52:8001/get?OID4.3.2.1=", values); 
    string tempString = client.DownloadString("http://10.10.1.52:8001/get?OID4.3.2.1="); 
    // etc. 
} 

Als beiseite zu verstehen, was der using Block wirklich der Fall ist, dann ist es logisch äquivalent dazu:

try 
{ 
    var client = new CookieAwareWebClient(); 

    // any code you add to the block 
} 
finally 
{ 
    client.Dispose(); 
} 

So wie jeder try Block, muss auch jeder Code, der eine in diesem Block deklarierte Variable verwendet, in diesem Block sein.

+1

Es ist schwierig zu sagen, ob dies das echte Problem ist, da der Code wie gepostet nicht kompiliert wird (er enthält andere Verweise auf "Client" außerhalb des verwendeten Blocks) –

+0

@Damien_The_Unbeliever: Fair point. Es ist im Allgemeinen eine komische Frage, und "die using-Anweisung funktioniert nicht" ist kaum eine effektive Beschreibung des Problems. Ich vermute, dass ein Verständnis des 'using'-Blocks immer noch der Kern des Problems ist, zumindest soweit es dargestellt wurde. Aber wenn das OP weitere Einsichten in die Art des Problems hat, wäre das ebenfalls hilfreich. (In der Tat, der Code in der Frage wird nicht für eine Reihe von Gründen kompilieren. Es ist ein bisschen freihändig Chaos ...) – David

+0

Ja, tut mir leid Jungs. Dies ist das erste Mal, dass ich das für mich mache. Meine Firma hat mich auf dieses Projekt gesetzt und ich habe offensichtlich keine Erfahrung. Ich habe meinen using-Block repariert, aber ich glaube nicht, dass ich ihn dort behalten kann, wo er ist. Ich habe eine Fehlermeldung, die besagt, dass "ungültiges Token" in der Klasse usw. verwendet wird.Ich denke, weil ich in einer Klasse bin? Aber wenn ich es nach draußen bringe, vermasselt es all meine anderen Variablen. Tut mir leid, dass ich zu diesem Thema nicht sehr informiert bin. –

0

Sie haben die using (var client ...) mit einem ; so terminiert, dass die client nicht mehr zugänglich ist. Also, was Sie tun müssen, ist der Rest des Codes innerhalb der using block.

using (var client = new CookieAwareWebClient()) 
{ 
    var values = new NameValueCollection 
    { 
     {"username", "admin"}, 
     {"password","secret"}, 
    }; 
    client.UpLoadValues("http://10.10.1.52:8001/get?OID4.3.2.1=", values); 
    string tempString = client.DownloadString("http://10.10.1.52:8001/get?OID4.3.2.1="); 
    Stream response = myClient.OpenRead("http://10.10.1.52:8001/get?OID4.3.2.1="); 
    Console.WriteLine(tempString); 
} 

Hinweis: Ich bin wenig verwirrt über myClient ist, dass ein Tippfehler oder ein Zweck voll Variable außerhalb der using block erklärt.

0

sollten Sie verwenden wie die Verwendung von:

using (var client = new CookieAwareWebClient()) 
{ 
     var values = new NameValueCollection 
     { 
      {"username", "admin"}, 
      {"password","secret"}, 
     }; 
     client.UpLoadValues("http://10.10.1.52:8001/get?OID4.3.2.1=", values); 

     string tempString = client.DownloadS`enter code here`tring("http://10.10.1.52:8001/get?OID4.3.2.1="); 
     Stream response = myClient.OpenRead("http://10.10.1.52:8001/get?OID4.3.2.1="); 
} 

Da ein „Client“, wenn Anfang Verwendung erstellen und verfügen dann die Verwendung von Block beendet ist.

Verwandte Themen