2010-12-29 3 views
1

웹 요청에서 사용자 지정 값을 보내야만 상황이 발생하여 응용 프로그램의 응답에서 사용할 수 있습니다. 내 응용 프로그램이 여러 요청을 보낼 수 있으므로 각 요청을 비동기 적으로 보내려면 BeginGetResponse을 사용하고 있습니다.BeginGetResponse 콜백에서 사용할 요청이있는 사용자 지정 값 전달

현재 개인 변수를 사용하여 값을 캐싱하고 콜백 메소드에서 액세스하고 있습니다. 이전 요청에서 응답을 받기 전에 동일한 메소드가 호출 된 경우 데이터가 변경 될 수 있으므로 문제 해결을 요청하는 것으로 알고 있습니다.

응답에서 응답을 처리하기 위해 요청에서 데이터를 전달하는 가장 좋은 방법은 무엇입니까? 당신은 requestid를 포함하는 새로운 객체를 생성해야

public void SendRequestAsnyc(string param1, string param2, string uri, int id) 
{ 
    NameValueCollection @params = System.Web.HttpUtility.ParseQueryString(String.Empty); 
    @params.Add("param1", param1); 
    @params.Add("param2", param2);   
    byte[] data = UTF8Encoding.UTF8.GetBytes(@params.ToString()); 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);   
    request.Method = WebRequestMethods.Http.Post; 
    request.ContentLength = data.Length; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    var stream = request.GetRequestStream(); 
    stream.Write(data, 0, data.Length); 
    // take a note of data to be processed in the callback 
    _cachedId = id;  
    IAsyncResult ar = request.BeginGetResponse(new AsyncCallback(GetAsyncResponse), request); 
} 

private void GetAsyncResponse(IAsyncResult result) 
{ 
    HttpWebRequest request = (HttpWebRequest)result.AsyncState; 
    if (request.HaveResponse) 
    {     
     var response = (HttpWebResponse)request.EndGetResponse(result); 
     var reader = new System.IO.StreamReader(response.GetResponseStream()); 
     var data = reader.ReadToEnd(); 
     // process data 
     // use _cachedId here to update database with response 
    } 
} 

답변

12

: 내 초기 생각은 사용자 정의 헤더했지만 나는 확실하지 않다 ...

다음은 순간에 내 코드입니다. 이전 버전의 C#에서는 개체 배열 또는 익명 개체를 사용하여이 작업을 수행 할 수있었습니다. 다음은 객체의 배열 함께 할 것입니다 방법은 다음과 같습니다

IAsyncResult ar = request.BeginGetResponse(GetAsyncResponse, new object[] {request, id}); 

private void GetAsyncResponse(IAsyncResult result) 
{ 
    object[] params = (object[])result.AsyncState; 
    HttpWebRequest request = (HttpWebRequest)params[0]; 
    int id = (int)params[1]; 
    // process here 
} 

4.0 C#, 당신은 Tuple<HttpWebRequest, int>를 사용할 수 있습니다.

+1

+1 나는 결코 그렇게 생각하지 못했다고 생각합니다 ... 내가 너무 오랫동안 그걸 쳐다 보았다고 생각합니다! – James

+0

나는 또한 아주 멋지고 똑똑한 맞춤 클래스를 만들 수있었습니다. 왜 그런지 생각하지 않았을 것입니다. 왜 그런지, 그것은 람다 표현 과부하와 같습니다. – JabberwockyDecompiler

관련 문제