作为一个例子,我试图改变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()
的标准代码。我是否希望从零开始写一篇文章?我想复制+粘贴原始代码然后更改它。我已经尝试过查看here,但这没什么用。
为了测试我是否走在正确的轨道上,我评论了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'.
所以有两个问题:
为什么这个类不起作用,哪里可以找到.NET类的代码,以便我可以改变它们?
答案 0 :(得分:1)
可以通过.config文件“注入”自定义Web请求类型。
答案 1 :(得分:1)
WebRequest.Create不会创建您的类的实例,它会创建一个HttpWebRequest实例,您可以从中派生它。虽然您可以将子实例转换为其父实例,但您不能将父实例转换为子实例。父母不保证拥有孩子的所有方法,而孩子则保证必须使用父母的方法。
您可以注册由您自己的派生类处理的自定义协议,或者通过配置注册您的类来处理默认协议。您是否需要这样做是一个悬而未决的问题。从您的示例中,一个简单的包装器可能就足够了。包装器将在构造函数中获取HttpWebRequest实例,并将标准WebRequest方法委托给该实例。任何新方法都会使用底层实例的方法进行工作,并将其他功能分层。
EX:
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,我不喜欢捕获异常并返回一个字符串。我宁愿让异常冒泡,因为该方法返回一个字符串。
答案 2 :(得分:0)
您可以通过不同方式浏览.NET Framework源,例如,通过.NET Reflector。但您也可以在线查看 - 例如,这里是HttpWebRequest.GetResponse()
的来源:
http://typedescriptor.net/browse/members/326374-System.Net.HttpWebRequest.GetResponse()
正如其他人所说,您不必复制粘贴原始代码。但知道它是如何工作的仍然很好。