2012-02-09 62 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

相关问题