2012-02-09 2 views
2

PC를 떠나는 대부분의 HTTP 요청에서 보낸 HTTP 헤더를 추가하거나 사용자 에이전트 문자열을 수정할 수 있어야합니다.컴퓨터의 모든 * HTTP 요청에 헤더 추가

대부분은 인터넷 익스플로러 내부뿐만 아니라 .NET 애플리케이션에서 오는 모든 것을 의미합니다.

나는 BHO를 작성하여 Internet Explorer 측면을 이미 능숙하게 만들었지 만 BHO는 IE에로드 된 ClickOnce 컨트롤에 의한 요청을 차단하지 않습니다. 이는 또 다른 요구 사항입니다.

내 경우 .NET 응용 프로그램은 모두 WebRequest.Create를 사용하여 요청을 처리합니다.

이것이 가능합니까? 나는 System.Net 스택에 코드를 주입하기를 희망한다.

프록시가 한 가지 가능성이 있지만 지옥처럼 수행하지 않는 프록시를 만드는 것은 어렵다는 것이 입증되었습니다. HTTPS 트래픽은 또 다른 문제입니다.

+0

실제로 프록시 이외의 다른 방법은 없습니다. 대부분의 * HTTP 요청에 대해 말하지만, 그 한계는 무엇입니까? 어떤 요청을 * 들으려고하지 않습니까? 다른 브라우저 (Firefox, Chrome 등)는 어떻습니까? –

+0

두 번째 단락에서 "가장"뜻하는 바를 설명합니다. – RMD

+0

오케이. 당신이 IE만을 의미하는 것은 확실하지 않았습니다. Internet Explorer를 포함하는 것이 이상하게 보였지만 다른 브라우저는 신경 쓰지 않으므로 디자인에 의한 것이지 사고는 아닙니다. –

답변

6

확인. 나는 이것을 알아 냈다.

WebRequest.Create 팩토리가 반환하기 전에 HttpWebRequest의 사용자 에이전트를 명시 적으로 설정하는 사용자 지정 웹 요청 모듈을 만들었습니다. 당신이 어셈블리에 서명하고 GAC에 추가해야합니다

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; 
    } 
} 

:

첫째, IWebRequestCreate를 구현하는 클래스를 만듭니다. 누군가가이 WebRequest.Create를 호출 할 때마다

<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> 

지금, 이미 설정 한 사용자 에이전트 문자열을 가진 HttpWebRequest를 얻을 수 있습니다 :

지금 당신의 시스템에서의 machine.config에서 다음 구성 섹션을 추가합니다.

는 또한 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

동시에 두렵고 무섭습니다. –

관련 문제