我尝试使用WebRequest.RegisterPrefix
注册装饰器IWebRequestCreate
实现,目的是添加" debug"场景(如模拟不同的连接场景)。
我正在使用Mango beta 2 SDK,RegisterPrefix
方法与" http://"一起使用时始终返回true作为前缀(或" http"就此而言),但未使用已注册的IWebRequestCreate实例。
我可以从文档中看到它应该为重复项返回false,但它似乎没有按照记录的方式运行。
还有其他方式以对消费者透明的方式实现我所追求的目标吗?
答案 0 :(得分:2)
我正在使用WebRequest.RegisterPrefix
进行单元测试,为前缀IWebRequestCreate
注册test://
实现,这确实有效。
我发现在为IWebRequestCreate
注册http://
后,使用WebRequest.Create
uri调用http://
会返回从已注册的IWebRequestCreate
创建的请求,但是调用WebRequest.CreateHttp
仍会返回HttpWebRequest
。
以下代码应该验证这一点,我正在使用Mango Beta 2 SDK(6-29-11):
public partial class MainPage : PhoneApplicationPage
{
public class FakeRequest : WebRequest
{
private Uri _uri;
public FakeRequest(Uri uri)
{
_uri = uri;
}
public override Uri RequestUri { get { return _uri; } }
}
public class FakeRequestFactory : IWebRequestCreate
{
public WebRequest Create(Uri uri)
{
return new FakeRequest(uri);
}
}
// Constructor
public MainPage()
{
InitializeComponent();
// returns System.Net.Browser.ClientHttpWebRequest
var request1 = WebRequest.Create("http://www.foo.com");
// returns System.Net.Browser.ClientHttpWebRequest
var request2 = WebRequest.CreateHttp("http://www.foo.com");
// returns true
bool result1 = WebRequest.RegisterPrefix("http://", new FakeRequestFactory());
// returns FakeRequest
var request3 = WebRequest.Create("http://www.foo.com");
// returns System.Net.Browser.ClientHttpWebRequest
var request4 = WebRequest.CreateHttp("http://www.foo.com");
// returns false
bool result2 = WebRequest.RegisterPrefix("http://", new FakeRequestFactory());
// returns false, as per the note in the documention
bool result3 = HttpWebRequest.RegisterPrefix("http://", new FakeRequestFactory());
}
}
答案 1 :(得分:0)
嘿,我知道这个问题是2岁,但我遇到了同样的问题。我想如果你尝试注册WebRequest.RegisterPrefix()
,你会发现http:
会返回false(注意单冒号,没有正斜杠)。如果我找到了解决方法,我会尽量记得更新这篇文章。
修改强>
在我的特定情况下,我想抛弃System.Net.FtpWebRequest
并推出自己的FTP客户端实现(因为框架的实现sucks)。
为了做到这一点,我使用了反射(以及一堆后期绑定技巧)来获取已注册前缀的arraylist并删除链接到内部System.Net.FtpWebRequestCreator
类的arraylist。
我不确定所有这些API是否适用于Windows手机,但这就是我所做的:
Type webRequest = typeof(System.Net.WebRequest);
Assembly system = Assembly.GetAssembly(webRequest);
Type ftpWebRequestCreator = system.GetType("System.Net.FtpWebRequestCreator");
ArrayList prefixList = (ArrayList)webRequest.GetProperty("PrefixList", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null, null);
IEnumerator enumerator = prefixList.GetEnumerator();
while (enumerator != null && enumerator.MoveNext()) {
if (object.ReferenceEquals(enumerator.Current.Creator.GetType(), ftpWebRequestCreator)) {
prefixList.Remove(enumerator.Current);
if (System.Net.WebRequest.RegisterPrefix(enumerator.Current.Prefix, new CustomWebRequestCreator())) {
enumerator = null;
} else {
enumerator = prefixList.GetEnumerator();
}
}
}
// Now I can use Create() on the base class
System.Net.WebRequest myCustomWebRequest = System.Net.WebRequest.Create("ftp://example.com/public");
这可以通过查找使用FtpWebRequestCreator
注册的所有前缀并将其替换为我自己的创建者来实现。将此修改为http(s)应该相当简单。
答案 2 :(得分:-1)
手机仅有一个客户端堆栈,因此RegisterPrefix对手机没有任何影响。