2 Stimmen

Wie man eine .NET-Klasse überschreibt

Als Beispiel versuche ich, die GetResponse() Funktion von HttpWebRequest

class HttpWebRequest_Override : HttpWebRequest
{
    public HttpWebRequest_Override(System.Runtime.Serialization.SerializationInfo SerializationInfo, System.Runtime.Serialization.StreamingContext StreamingContext) 
        : base(SerializationInfo, StreamingContext) { }

    public override WebResponse GetResponse()
    {
        //Edit GetResponse() code here.
    }
}

Ich kann jedoch den Standardcode für GetResponse() überall. Wird von mir erwartet, dass ich eine von Grund auf neu schreibe? Ich würde gerne den ursprünglichen Code kopieren und einfügen und ihn dann ändern. Ich habe bereits versucht zu suchen aquí aber das hat nicht viel geholfen.

Um zu testen, ob ich überhaupt auf dem richtigen Weg bin, habe ich Folgendes auskommentiert GetResponse() und versucht, die HttpWebRequest_Override so wie sie ist (nur mit dem Konstruktor).

Und es dann so zu benutzen:

public static string DownloadText(string url)
{
    try
    {
        var request = (HttpWebRequest_Override)WebRequest.Create(url);
        request.Proxy = null;
        var response = (HttpWebResponse)request.GetResponse();

        using (var reader = new StreamReader(response.GetResponseStream()))
        {
            return reader.ReadToEnd();
        }
    }
    catch (Exception ex) { return "error_program : "+ex.Message; }
}

Dies führt jedoch zu einer Fehlermeldung:

Unable to cast object of type 'System.Net.HttpWebRequest' to type 'bulktest.HttpWebRequest_Override'.

Also zwei Fragen:

Warum funktioniert die Klasse nicht, und wo kann ich den Code für .NET-Klassen finden, damit ich sie ändern kann?

1voto

leppie Punkte 111830

Benutzerdefinierte Webanforderungstypen können über die .config-Datei "injiziert" werden.

Schauen Sie hier nach: http://msdn.microsoft.com/en-us/library/bc0fhzk5.aspx

1voto

tvanfosson Punkte 506878

WebRequest.Create erstellt keine Instanz Ihrer Klasse, sondern eine Instanz von HttpWebRequest, von der Sie abgeleitet sind. Sie können zwar eine Instanz eines untergeordneten Elements als dessen übergeordnetes Element erstellen, nicht aber eine Instanz des übergeordneten Elements als untergeordnetes Element. Es ist nicht garantiert, dass die übergeordnete Instanz über alle Methoden der untergeordneten Instanz verfügt, während die untergeordnete Instanz garantiert über die Methoden der übergeordneten Instanz verfügt.

Sie können benutzerdefinierte Protokolle registrieren, die von Ihrer eigenen, abgeleiteten Klasse verarbeitet werden, oder über die Konfiguration Ihre Klasse für die Verarbeitung der Standardprotokolle registrieren. Ob Sie dies tun müssen, ist eine offene Frage. In Ihrem Beispiel könnte ein einfacher Wrapper ausreichend sein. Der Wrapper würde eine HttpWebRequest-Instanz im Konstruktor nehmen und die Standard-WebRequest-Methoden an diese Instanz delegieren. Alle neuen Methoden würden die Methoden der zugrundeliegenden Instanz für ihre Arbeit verwenden und Ihre zusätzliche Funktionalität darüber legen.

EX:

 var request = new WebRequestWrapper((HttpWebRequest)WebRequest.Create(url));
 var html = request.DownloadText();

Wie Ihre Klasse aussehen könnte:

 public class WebRequestWrapper
 {
      private HttpWebRequest _request;

      public WebRequestWrapper(HttpWebRequest request)
      {
          this._request = request;
      }

      public string DownloadText()
      {
          using (var response = (HttpWebResponse)this._request.GetResponse())
          using (var reader = new StreamReader(response.GetResponseStream()))
          {
              return reader.ReadToEnd();
          }
      }
 }

FWIW, ich mag es nicht, die Ausnahme abzufangen und eine Zeichenfolge zurückzugeben. Ich würde lieber die Ausnahme aufblasen lassen, da die Methode eine Zeichenfolge zurückgibt.

0voto

Dmytro Shevchenko Punkte 31263

Sie können den Quellcode von .NET Framework auf verschiedene Weise durchsuchen, zum Beispiel über den .NET Reflector. Sie können ihn aber auch online einsehen - hier ist zum Beispiel der Quellcode von HttpWebRequest.GetResponse() :

http://typedescriptor.net/browse/members/326374-System.Net.HttpWebRequest.GetResponse()

Wie bereits von anderen erwähnt, müssen Sie den ursprünglichen Code nicht kopieren und einfügen. Aber es ist trotzdem gut zu wissen, wie es funktioniert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X