Jad*_*ias 7 .net c# inheritance httpwebrequest
我目前正在尝试修改一些HttpWebRequest函数,但我不能通过继承来实现,因为HttpWebRequest没有公共构造函数(除了反序列化构造函数).有没有解决方法来做到这一点?
我的目标是编写类似下面示例的代码,但此类对象必须继承HttpWebRequest属性和方法:
using System;
using System.Net;
using System.Threading;
public class AsyncWebRequest:WebRequest
{
private readonly AsyncCallback getResponseCallback;
private readonly Uri uri;
private volatile int RetriesLeft = 3;
private volatile WebRequest request;
public AsyncWebRequest(string uri, AsyncCallback getResponseCallback)
:this(new Uri(uri), getResponseCallback)
{
}
public AsyncWebRequest(Uri uri, AsyncCallback getResponseCallback):base()
{
this.uri = uri;
this.getResponseCallback = getResponseCallback;
}
private IAsyncResult BeginGetResponse()
{
request = HttpWebRequest.CreateDefault(uri);
((HttpWebRequest)request).ReadWriteTimeout = Timeout;
var result = request.BeginGetResponse(GetResponseCallback, null);
ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle,
GetResponseTimeout, null, Timeout, true);
return result;
}
private void GetResponseTimeout(object state, bool timedOut)
{
if (timedOut)
{
Retry();
}
}
private void Retry()
{
request.Abort();
bool retry = false;
lock (request)
{
if (RetriesLeft > 0)
{
Interlocked.Decrement(ref RetriesLeft);
retry = true;
}
}
if (retry)
{
BeginGetResponse();
}
else
{
getResponseCallback(null);
}
}
private void GetResponseCallback(IAsyncResult AsyncResult)
{
try
{
getResponseCallback(AsyncResult);
}
catch(WebException webException)
{
Retry();
}
}
}
Run Code Online (Sandbox Code Playgroud)
Ray*_*urg 12
你不能通过HttpWebRequest继承(如果你不想调用序列化构造函数),但是你可以通过组合和委托,以及通过WebRequest的继承(我不确定是否会为你做,但是在功能上它非常相似).WebRequest有一个默认构造函数.
在这种情况下,你不能让类'be'成为一个HttpWebRequest(就像在一个is-a关系中),因为你不能从它扩展,但它将是一个WebRequest,这应该足够了.
您可以编写一个继承自WebRequest的类,该类具有WebRequest类型的实例成员,创建HttpWebRequest并在新类型的构造函数中分配实例成员,并委托对该引用的所有调用(类似于装饰器模式):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
namespace ClassLibrary1
{
public class MyHttpWebRequest : WebRequest
{
private WebRequest request;
public MyHttpWebRequest(string uri)
{
request = HttpWebRequest.Create(uri);
}
public override WebResponse GetResponse()
{
// do your extras, or just delegate to get the original code, as long
// as you still keep to expected behavior etc.
return request.GetResponse();
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7463 次 |
最近记录: |