2015-01-08 3 views
0

저는 웹 서버에 비동기 적으로 로그인하고 나중에 데이터에 대한 작은 요청을 보내는 산업용 웹 모듈을 연구하고 있습니다. 먼저 세션 쿠키를 수신하라는 GET 요청을 보낸 다음 UN 및 PW와 POST 요청을 보냅니다. HttpWebRequest 클래스의 BeginGetRequestStream 및 BeginGetResponse 메서드를 사용하려고합니다. 그러나 아래의 MSDN에서 따옴표를 읽으면 일부 부분이 비동기 적이라는 것을 언급합니다.BeginGetRequestStream 및 BeginGetResponse를 실제로 비동기로 만드는 방법은 무엇입니까?

이 문제를 어떻게 해결해야합니까? 나는이 방법들을 완전히 사용하지 말아야 하는가? 아니면 fail-safe 메카니즘을 만들어야 만 코드가 길어질지라도 (만약 가능하다면) 코드가 건너 뛰게된다면? 코딩 노력은 문제가되지 않습니다. 중요한 것은 모듈이 실제로 비동기이며 메인 프로그램을 절대 차단하지 않는 것입니다.

감사합니다.

BeginGetRequestStream 방법

완료하는 데 (DNS 해상도, 프록시 탐지 및 TCP 소켓 예를 들어 연결)이 방법은 비동기되기 전에 일부 동기 설치 작업 이 필요합니다. 결과로이 메서드는 사용자 인터페이스 (UI) 스레드에서 절대로 호출해서는 안됩니다. 네트워크 동기화에 대한 예외가 발생하기까지 상당한 시간 (네트워크 설정에 따라 수 분내 )이 소요되어 초기 동기화 설정 작업을 완료해야하므로 오류가 발생하거나 메서드 이 성공합니다.

BeginGetResponse 메서드는 (DNS 확인, 프록시 검색 및 TCP 소켓 연결, 예 : )으로 일부 동기 설정 작업을 필요로합니다.이 메서드는 비동기식으로 처리됩니다. 결과적으로 사용자 인터페이스 (UI) 스레드 에서이 메서드를 호출하면 안됩니다. 네트워크에 따라 초기 동기화 설정 작업을 완료하는 데 상당한 시간이 걸릴 수 있으므로 (네트워크 설정에 따라 최대 몇 분, ) 오류가 발생하거나 메서드 이 성공합니다.

+1

왜 'HttpClient'를 사용하지 않으시겠습니까? 그것은 완전히'async'이고 Task Based PRogramming 모델 –

+0

Oha, 정보를 제공해 주신 것을지지합니다. 어떤 경우에도 훨씬 더 완전히 다른 방법이 있습니까? 내가 방법에 사용하는 데 많은 시간을 할애하기 전에 그들 모두에 대해 조금 알고 싶다. (불행히도 나는 이미 HttpWebRequest에 시간을 할애했다. 그러나 VB에서 학습 한 시간이기도하다.) – Comodorewaran

+0

예를 들어, Await에 대해서 비동기? – Comodorewaran

답변

0

내 의견에서 언급 한대로 HttpClient을 사용하면 async-await을 사용할 수 있습니다. 여기에 예제가 있습니다

private async Task DownloadUrlAsync(string url) 
{ 
    HttpClient httpCLient = new HttpClient(); 
    textBox1.Text = await httpCLient.GetStringAsync(url); 
} 
+0

예를 들어 주셔서 감사합니다. HttpClient와 Await/Async가 4.5 버전이라는 것을 알았습니다. 현재 4.0으로 작업하고 있습니다. BeginGetResponse가 부분적으로 동기식이기는하지만 어떻게 든 내 실수로 프로젝트를 복구 할 수있는 방법이 있다고 생각합니까? 예를 들어 Stream/Request를 시작하기 전에 서버에 연결하려고합니까? 아니면 이러한 원형 교차로를 버리고 HttpClient 메소드로 이동하는 것이 더 좋을까요? (회사에서 4.5를 사용할 수 있는지 여부에 따라 달라 지겠지만) – Comodorewaran

+0

더 나은 옵션은 'WebClient'http://msdn.microsoft.com/en-us/library/system.net.webclient%28v=vs.110%29 일 수 있습니다. aspx –

+0

MSDN에서 : WebClient는 WebRequest 및 WebResponse 클래스를 사용하여 인터넷 리소스 ....에 대한 실제 연결을 만들고 .... WebClient 클래스는 WebRequest 클래스를 사용하여 리소스에 대한 액세스를 제공합니다. 그렇다면 WebClient를 동일한 기본 문제가있는 "추상적 인"방법으로 만들지는 않습니까? – Comodorewaran