2011-07-07 13 views
4

WebRequest.RegisterPrefixを使用して、デコレータIWebRequestCreateの実装を登録しようとしました(異なる接続シナリオをエミュレートするなど)。WebRequest.RegisterPrefix for http:// trueを返しても動作しない

マンゴーベータ2 SDKを使用していて、RegisterPrefixメソッドは、接頭辞として "http://"を使用すると常にtrueを返しますが、登録済みのIWebRequestCreateインスタンスは存在しません中古。

重複してもfalseを返すはずですが、文書化されているように機能していないようです。

私が消費者にトランスペアレントな方法で後に何を達成するための方法はありますか?

答えて

2

私はユニットテストにWebRequest.RegisterPrefixを使用しています。接頭辞test://IWebRequestCreateの実装を登録しています。これは機能します。

は私が登録 IWebRequestCreateから作成されたリクエストを返します http://でURIを WebRequest.Createを呼び出し、 http://ため IWebRequestCreateを登録した後、これを見つけましたが、 WebRequest.CreateHttpを呼び出すと、まだ HttpWebRequestを返します。

次のコードは、これを確認する必要があり、私はマンゴーベータ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

電話にはクライアントスタックがあるため、RegisterPrefixは電話機に影響を与えません。

+0

カスタムプロトコルの登録はどうですか?実装されていない場合は、APIを削除したり、NotSupportedExceptionをスローしたりしないでください。 –

+0

APIは異なるプロトコルではなく、既存のプロトコル(https/http)のみを変更します。スタックが1つしかないので、予想されることが実行されます。それがNotSupportedを投げていない理由は、それが言うことを(デスクトップと電話の間の共有コードが壊れないように)することです。 –

+0

クライアント/ブラウザの実装間を交換する場合は、インターフェイスではなく列挙型を使用してください。なぜ拡張性の誤った認識を与えるのですか? –

0

ねえ、私はこの質問には2歳知っているが、私は出くわしました同じ問題。 http:を登録しようとするとWebRequest.RegisterPrefix()になります(単一のコロンとスラッシュはありません)。回避策が見つかった場合は、この投稿を更新することを忘れないでください。私は(フレームワークの実装sucksので)System.Net.FtpWebRequestを投げると自分のFTPクライアントの実装をロールしたかった私の特定のケースで

EDIT

これを行うために、私は登録された接頭辞のarraylistを取得し、内部System.Net.FtpWebRequestCreatorクラスにリンクされているものを削除するためにリフレクション(および遅いバインディングトリック)を使用しました。

私は、これらのAPIのすべてが、Windowsの携帯電話のために利用できるかどうかわからないんだけど、ここで私がやったことだ:

これは FtpWebRequestCreatorに登録されているすべての接頭辞を見つけ、自分でそれらを置き換えることによって動作
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"); 

クリエイター。 http(s)にこれを適合させるのはかなり簡単です。

関連する問題