2011-07-07 61 views
4

我試圖用WebRequest.RegisterPrefix註冊一個裝飾IWebRequestCreate實現的意圖是要加上「調試」的場景(如模擬不同的連接方案)。WebRequest.RegisterPrefix對於http://返回true,不工作

我在使用Mango beta 2 SDK和RegisterPrefix方法時總是以「http://」作爲前綴(或「http」)作爲前綴返回true,但註冊的IWebRequestCreate實例不在用過的。

我可以從文檔中看到,它應該爲重複項返回false,但它似乎不像記錄中那樣起作用。

是否有任何其他方式實現我對消費者透明的方式?

回答

2

我使用WebRequest.RegisterPrefix單元測試,註冊一個IWebRequestCreate實施的test://的前綴,這確實工作。

我發現,登記爲http://IWebRequestCreate後,調用WebRequest.Createhttp:// URI將返回從註冊IWebRequestCreate產生的一個請求,但調用WebRequest.CreateHttp仍然會返回一個HttpWebRequest

下面的代碼應該驗證這一點,我使用的是芒果Beta 2的SDK(11年6月29日):

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

電話只有有一個客戶端堆棧,所以RegisterPrefix對電話沒有影響。

+0

如何註冊自定義協議?如果它沒有實現,他們不應該刪除API或拋出NotSupportedException? –

+0

API不是關於不同的協議,它只改變現有的協議(https/http)。由於只有一個堆棧,它可以完成預期的任務。它不會拋出NotSupported的原因是它做它所做的事情(以便桌面和手機之間的共享代碼不會中斷)。 –

+0

如果只是在客戶端/瀏覽器實現之間進行交換,爲什麼不使用枚舉而不是接口呢?爲什麼要給出可擴展性的錯誤認識? –

0

嘿,我知道這個問題是2歲,但我穿過來了同樣的問題。我想你會發現WebRequest.RegisterPrefix()確實如果您嘗試註冊http:(注意單個冒號,沒有正斜槓),則返回false。如果我找到解決方法,我會盡量記住更新這篇文章。

編輯

在我的具體情況,我想扔出去System.Net.FtpWebRequest,並推出自己的FTP客戶端實現(因爲該框架的實施sucks)。

爲了做到這一點,我使用反射(和一堆後期綁定技巧)來獲取註冊前綴的數組列表,並刪除鏈接到內部類System.Net.FtpWebRequestCreator的數組。

我不知道如果所有這些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),這應該相當簡單。