2012-02-09 109 views
2

我需要能夠附加大多數HTTP請求發送的HTTP標頭(或修改用戶代理字符串),才能離開PC。將標題添加到計算機上的所有* HTTP請求

到最大,我的意思是Internet Explorer中什麼,以及什麼從.NET應用程序來。

我已經寫一個BHO acoomplished物聯網瀏覽器的一面,但BHO不會攔截由加載到IE瀏覽器,這是另一項要求ClickOnce的控制提出了要求。

在我的情況下,.NET應用程序全部採用WebRequest.Create到了他們的請求。

這可能嗎?我希望我能在System.Net堆棧的某處注入一些代碼。

代理是一種可能性,但它已被證明很難創建一個不喜歡地獄進行代理。 HTTPS流量是另一個問題。

+0

除了代理沒有其他任何方式。你說*最* HTTP請求,有什麼限制?什麼要求*不要*你想趕上?其他瀏覽器(Firefox,Chrome,...)呢? – 2012-02-09 19:46:46

+0

我在第二段中解釋我的意思是「最」。 – RMD 2012-02-09 21:34:42

+0

好的 - 你不清楚你的意思是隻有IE;包括IE瀏覽器似乎很奇怪,但不關心其他瀏覽器,所以只是檢查一下是否是設計,而不是偶然。 – 2012-02-09 21:39:36

回答

6

好的。我明白了這一點。

我創建了一個明確設置HttpWebRequest的用戶代理之前,它是由類向WebRequest.Create工廠返回一個自定義的web請求模塊。

首先,創建一個類,實現IWebRequestCreate:

public class CustomHttpRequestCreator : IWebRequestCreate 
{ 
    public CustomHttpRequestCreator(){} 

    public WebRequest Create(Uri uri) 
    { 
     HttpWebRequest webRequest = Activator.CreateInstance(typeof(HttpWebRequest), 
             BindingFlags.CreateInstance | BindingFlags.Public | 
             BindingFlags.NonPublic | BindingFlags.Instance, 
             null, new object[] { uri, null }, null) as HttpWebRequest; 

     webRequest.UserAgent = "OMG IT WORKED!"; 
     return webRequest; 
    } 
} 

您需要登錄該組件並把它添加到GAC。

現在,在你的機器上在machine.config,添加以下配置部分:

<system.net> 
    <webRequestModules> 
     <remove prefix="http:"/> 
     <remove prefix="https:"/> 
     <add prefix="http:" type="HttpWebRequestTest.CustomHttpRequestCreator, HttpWebRequestTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=4ba7a6b9db5020b7" /> 
     <add prefix="https:" type="HttpWebRequestTest.CustomHttpRequestCreator, HttpWebRequestTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=4ba7a6b9db5020b7" /> 
    </webRequestModules> 
</system.net> 

現在,每當有人打電話WebRequest.Create,他們會得到一個HttpWebRequest的已設置的用戶代理字符串。


我也試圖創建一個從HttpWebRequest的繼承的自定義類,但是這是棘手的,因爲沒有默認的公共構造。唯一的公共構造者是一個過時的ISerializable實現。我得到了我的dervied類與ISerializable構造函數一起使用,但生成的「僞水合」對象未處於有效狀態,可能是由於ISerializable實現已過時並且尚未由Microsoft維護。

不過,這是可能的,如果他們調查更詳細一點使用時遇到的錯誤人能夠完成這項工作。具體而言,ServicePoint相關訪問存在問題。使用反射,人們可能會得到這個東西的工作。這裏是我的實現供參考:

public class CustomHttpWebRequest : HttpWebRequest 
{ 
    public CustomHttpWebRequest(SerializationInfo serializationInfo, StreamingContext streamingContext) : base(serializationInfo, streamingContext) { } 

    internal CustomHttpWebRequest(Uri uri) : base(BuildSerializationInfo(uri), new StreamingContext()) 
    { 
     this.UserAgent = "OMG IT WORKED! (Constructor)"; 
    } 

    private static SerializationInfo BuildSerializationInfo(Uri uri) 
    { 
     HttpWebRequest webRequest = Activator.CreateInstance(typeof(HttpWebRequest), 
             BindingFlags.CreateInstance | BindingFlags.Public | 
             BindingFlags.NonPublic | BindingFlags.Instance, 
             null, new object[] { uri, null }, null) as HttpWebRequest; 

     var serializationInfo = new SerializationInfo(typeof(HttpWebRequest), new System.Runtime.Serialization.FormatterConverter()); 
     ((ISerializable)webRequest).GetObjectData(serializationInfo, new StreamingContext()); 
     return serializationInfo; 
    } 

    public override WebResponse GetResponse() 
    { 
     this.UserAgent = "OMG IT WORKED!"; 
     return base.GetResponse(); 
    } 

    public override IAsyncResult BeginGetResponse(AsyncCallback callback, object state) 
    { 
     this.UserAgent = "OMG IT WORKED ASYNC!"; 
     return base.BeginGetResponse(callback, state); 
    } 
} 
+0

這真是太棒了,同時也很可怕。 – 2013-04-12 20:32:48