2017-10-10 9 views
1

"host"에 대한 요청 헤더에 사용자 지정 값을 추가하여 IP 주소로 웹 페이지를 호출하려고합니다. "
"코드 :Unity의 제한된 HttpWebRequest 헤더 변경

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://1.1.1.1"); 
     request.Headers["Host"] = "xyz.net"; 
WebResponse response = request.GetResponse(); 

그러나 오류 제공합니다

ArgumentException: restricted header

그것은 어떤 헤더는 .NET 2.0 수정할 수 없습니다 보인다 그래서 호스트를 변경할 수있는 방법이를 또는 .net 버전을보다 높은 버전으로 변경하십시오.

+0

[HttpWebRequest에서 사용자 지정 "호스트"헤더를 설정하는 방법] (https://stackoverflow.com/questions/1450937/how-to-set-custom-host-header-in-httpwebrequest) – joreldraw

+0

@ joreldraw 이것은 Unity입니다. 리플렉션을 사용하기 때문에 이들 중 아무 것도 작동하지 않아야합니다. – Programmer

+0

[System.Net.WebRequest를 사용할 때 일부 HTTP 헤더를 설정할 수 없습니다.] (https://stackoverflow.com/questions/239725/cannot-set-some-http-headers- 언제 사용 시스템 - 그물 - 웹 요청) – Foggzie

답변

2

리플렉션을 통해이를 수행 할 수 있습니다. 불행하게도 Unity가 Mono를 사용하고 변수 이름이 완전히 다르므로 GetField이 헤더를 포함하는 변수를 찾을 수 없으므로 유사한 질문의 C# 응답은 작동하지 않습니다.

HttpWebRequest 클래스의 모든 헤더를 HttpWebRequest.GetType().GetFields으로 덤프하고 헤더를 보유하는 필드의 이름을 찾습니다. 내 테스트에서 필드 이름은 "webHeaders"이며 WebHeaderCollection입니다.

다음은 수정 확장 방법이다 반사에 "webHeaders" 그 :

public static class ExtensionMethods 
{ 
    public static void changeSysTemHeader(this HttpWebRequest request, string key, string value) 
    { 
     WebHeaderCollection wHeader = new WebHeaderCollection(); 
     wHeader[key] = value; 


     FieldInfo fildInfo = request.GetType().GetField("webHeaders", 
               System.Reflection.BindingFlags.NonPublic 
                | System.Reflection.BindingFlags.Instance 
                | System.Reflection.BindingFlags.GetField); 

     fildInfo.SetValue(request, wHeader); 
    } 

    public static void changeReflectionField(this HttpWebRequest request, string fieldName, object value) 
    { 
     FieldInfo fildInfo = request.GetType().GetField(fieldName, System.Reflection.BindingFlags.NonPublic 
                | System.Reflection.BindingFlags.Instance 
                | System.Reflection.BindingFlags.GetField); 

     fildInfo.SetValue(request, value); 
    } 
} 

사용법 :

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://1.1.1.1"); 

//Change Host header 
request.changeSysTemHeader("Host", "xyz.net"); 

request.changeReflectionField("hostChanged", true); 

WebResponse response = request.GetResponse(); 

User-Agent 같은 어떤 제한 헤더 작동합니다. Unity 2017.2으로 테스트되었습니다. 유니티 버전을 언급하고 필드 이름을 어떻게 찾았는지, 미래에 변수 이름이 바뀌면 누구나 간단히 수정할 수 있습니다.