http://的WebRequest.RegisterPrefix返回true,不起作用

时间:2011-07-07 14:30:45

标签: networking windows-phone-7

我尝试使用WebRequest.RegisterPrefix注册装饰器IWebRequestCreate实现,目的是添加" debug"场景(如模拟不同的连接场景)。

我正在使用Mango beta 2 SDK,RegisterPrefix方法与" http://"一起使用时始终返回true作为前缀(或" http"就此而言),但未使用已注册的IWebRequestCreate实例。

我可以从文档中看到它应该为重复项返回false,但它似乎没有按照记录的方式运行。

还有其他方式以对消费者透明的方式实现我所追求的目标吗?

3 个答案:

答案 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对手机没有任何影响。