확인. 나는 이것을 알아 냈다.
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);
}
}
실제로 프록시 이외의 다른 방법은 없습니다. 대부분의 * HTTP 요청에 대해 말하지만, 그 한계는 무엇입니까? 어떤 요청을 * 들으려고하지 않습니까? 다른 브라우저 (Firefox, Chrome 등)는 어떻습니까? –
두 번째 단락에서 "가장"뜻하는 바를 설명합니다. – RMD
오케이. 당신이 IE만을 의미하는 것은 확실하지 않았습니다. Internet Explorer를 포함하는 것이 이상하게 보였지만 다른 브라우저는 신경 쓰지 않으므로 디자인에 의한 것이지 사고는 아닙니다. –