2

例として、私はのGetResponse()機能を変更しようとしています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.
    }
}

GetResponse()しかし、どこにも標準コードが見つかりません。ゼロから書くことを期待されていますか?元のコードをコピーして貼り付けてから変更したいのですが。私はすでにここを見てみましたが、それはあまり役に立ちませんでした。

私が正しい方向に進んでいるかどうかをテストするために、コメントアウトして、そのまま(コンストラクターのみGetResponse()を使用して)使用しようとしました。HttpWebRequest_Override

そしてそれを次のように使用します:

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; }
}

しかし、これはエラーをスローします:

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

したがって、2つの質問:

クラスが機能しないのはなぜですか。また、.NETクラスのコードをどこで見つけて、それらを変更できるのでしょうか。

4

3 に答える 3

1

WebRequest.Createは、クラスのインスタンスを作成するのではなく、派生元のHttpWebRequestのインスタンスを作成します。子のインスタンスを親としてキャストすることはできますが、親のインスタンスを子としてキャストすることはできません。親は子のすべてのメソッドを持っていることが保証されているわけではありませんが、子は親のメソッドを持っていることが保証されています。

独自の派生クラスによって処理されるカスタムプロトコルを登録するか、構成を介して、デフォルトプロトコルを処理するようにクラスを登録できます。これを行う必要があるかどうかは、未解決の問題です。あなたの例から、単純なラッパーで十分かもしれません。ラッパーはコンストラクターでHttpWebRequestインスタンスを取得し、標準のWebRequestメソッドをそのインスタンスに委任します。新しいメソッドは、基盤となるインスタンスのメソッドを使用して作業を行い、その上に追加の機能を重ねます。

元:

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

クラスは次のようになります。

 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、例外をキャッチして文字列を返すのは好きではありません。メソッドが文字列を返すので、例外をバブルアップさせたいと思います。

于 2012-04-29T13:29:53.753 に答える
1

カスタムWebリクエストタイプは、.configファイルを介して「挿入」できます。

こちらをご覧ください:http://msdn.microsoft.com/en-us/library/bc0fhzk5.aspx

于 2012-04-29T13:28:28.793 に答える
0

.NET Frameworkソースは、さまざまな方法で参照できます。たとえば、.NETReflectorを使用します。ただし、オンラインでも確認できます。たとえば、次のソースは次のHttpWebRequest.GetResponse()とおりです。

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

他の人が指摘しているように、元のコードをコピーして貼り付ける必要はありません。しかし、それがどのように機能するかを知ることは依然として良いことです。

于 2012-04-29T13:30:54.660 に答える