WebClient 클래스와 함께 CookieContainer 사용
이전에는 HttpWebRequest 및 HttpWebResponse 세션과 함께 CookieContainer를 사용했지만 이제는 WebClient와 함께 사용하고 싶습니다. 내가 이해하는 한 HttpWebRequests ( request.CookieContainer) 와 같은 내장 메소드는 없습니다 . CookieContainer의 WebClient에서 쿠키를 수집하려면 어떻게해야합니까?
public class CookieAwareWebClient : WebClient
{
private readonly CookieContainer m_container = new CookieContainer();
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
HttpWebRequest webRequest = request as HttpWebRequest;
if (webRequest != null)
{
webRequest.CookieContainer = m_container;
}
return request;
}
}
이것이 최선의 방법입니까?
예. IMHO는 GetWebRequest ()를 재정의하는 것이 WebClient의 제한된 기능에 대한 최상의 솔루션입니다. 이 옵션에 대해 알기 전에 HttpWebRequest 계층에서 WebClient가 거의 고통스럽지 않은 코드를 많이 작성했습니다. 파생이 훨씬 쉽습니다.
또 다른 옵션은 일반 WebClient 클래스를 사용하지만 요청하기 전에 쿠키 헤더를 수동으로 채우고 응답에서 Set-Cookies 헤더를 가져 오는 것입니다. : 만들고 이러한 헤더 쉽게 분석 내린 CookieContainer 클래스의 도우미 방법이 있습니다 CookieContainer.SetCookies()와 CookieContainer.GetCookieHeader()각각은,.
이전 방법은 호출자가 더 쉽고 두 번째 옵션보다 반복 코드가 덜 필요하기 때문에 선호합니다. 또한 파생 접근 방식은 여러 확장 성 시나리오 (예 : 쿠키, 프록시 등)에 대해 동일한 방식으로 작동합니다.
WebClient wb = new WebClient();
wb.Headers.Add(HttpRequestHeader.Cookie, "somecookie");
댓글에서
"somecookie"대신 쿠키의 이름과 값을 어떻게 포맷합니까?
wb.Headers.Add(HttpRequestHeader.Cookie, "cookiename=cookievalue");
여러 쿠키의 경우 :
wb.Headers.Add(HttpRequestHeader.Cookie,
"cookiename1=cookievalue1;" +
"cookiename2=cookievalue2");
이것은 당신이 찾은 기사의 확장 일뿐입니다.
public class WebClientEx : WebClient
{
public WebClientEx(CookieContainer container)
{
this.container = container;
}
public CookieContainer CookieContainer
{
get { return container; }
set { container= value; }
}
private CookieContainer container = new CookieContainer();
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest r = base.GetWebRequest(address);
var request = r as HttpWebRequest;
if (request != null)
{
request.CookieContainer = container;
}
return r;
}
protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
{
WebResponse response = base.GetWebResponse(request, result);
ReadCookies(response);
return response;
}
protected override WebResponse GetWebResponse(WebRequest request)
{
WebResponse response = base.GetWebResponse(request);
ReadCookies(response);
return response;
}
private void ReadCookies(WebResponse r)
{
var response = r as HttpWebResponse;
if (response != null)
{
CookieCollection cookies = response.Cookies;
container.Add(cookies);
}
}
}
The HttpWebRequest modifies the CookieContainer assigned to it. There is no need to process returned cookies. Simply assign your cookie container to every web request.
public class CookieAwareWebClient : WebClient
{
public CookieContainer CookieContainer { get; set; } = new CookieContainer();
protected override WebRequest GetWebRequest(Uri uri)
{
WebRequest request = base.GetWebRequest(uri);
if (request is HttpWebRequest)
{
(request as HttpWebRequest).CookieContainer = CookieContainer;
}
return request;
}
}
I think there's cleaner way where you don't have to create a new webclient (and it'll work with 3rd party libraries as well)
internal static class MyWebRequestCreator
{
private static IWebRequestCreate myCreator;
public static IWebRequestCreate MyHttp
{
get
{
if (myCreator == null)
{
myCreator = new MyHttpRequestCreator();
}
return myCreator;
}
}
private class MyHttpRequestCreator : IWebRequestCreate
{
public WebRequest Create(Uri uri)
{
var req = System.Net.WebRequest.CreateHttp(uri);
req.CookieContainer = new CookieContainer();
return req;
}
}
}
Now all you have to do is opt in for which domains you want to use this:
WebRequest.RegisterPrefix("http://example.com/", MyWebRequestCreator.MyHttp);
That means ANY webrequest that goes to example.com will now use your custom webrequest creator, including the standard webclient. This approach means you don't have to touch all you code. You just call the register prefix once and be done with it. You can also register for "http" prefix to opt in for everything everywhere.
참고URL : https://stackoverflow.com/questions/1777221/using-cookiecontainer-with-webclient-class
'Programming' 카테고리의 다른 글
| overflow : hidden이 왜 작동하지 않습니까? (0) | 2020.06.18 |
|---|---|
| 병합 : Hg / Git vs. SVN (0) | 2020.06.18 |
| nginx : 모든 요청을 단일 HTML 페이지로 전송 (0) | 2020.06.18 |
| 메소드를 스레드로부터 안전하게 만드는 것은 무엇입니까? (0) | 2020.06.18 |
| gcc 명령 줄을 사용하여 .c 파일에서 .so 파일 작성 (0) | 2020.06.18 |