2012-01-20 51 views
0

我想通過驗證服務器上的用戶名/密碼來驗證我的WP7應用中的用戶。以某種方式返回來自HTTPWebRequest的響應?

在我的「驗證用戶」方法中,我創建了一個HTTPWebRequest和我需要驗證的東西。

然後據我所見,唯一的選擇是使用request.BeginGetResponse和異步回調。

但是我想以與創建請求的方法相同的方式返回請求中的響應,我該如何實現?

回答

0

BeginGetResponse返回一個IAsyncResult,它有一個等待處理,當請求完成時發出信號。所有你需要做的就是等待這個句柄:無法在WP7工作]


更新:使用ManualResetEvent

var mre = new ManualResetEvent(false); 

var iar = myHttpWebRequest.BeginGetResponse(state => mre.Set(), null); 

mre.WaitOne(); 

var response = myHttpWebRequest.EndGetResponse(iar); 
+0

據我已經能夠閱讀,現在已經測試,WP7上不支持AsyncWaitHandle:( 它引發NotSupportedException。 –

+0

如果你只是刪除等待和調用EndGetResponse會發生什麼?它應該塊,直到響應可用 –

+0

然後響應將是無效 –

0

我不知道爲什麼你想使它返回調用方法。我只想用標準WebClient行爲象下面這樣:

public void ValidateUser() 
{ 
    WebClient webClient = new WebClient(); 

    Uri uri = new Uri(url); 
    webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted); 
    webClient.DownloadStringAsync(new Uri(url)); 
} 

void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
{ 
    //Validate result from response by using e.Result 
} 
+0

我要調用的方法?在驗證用戶。但是,所有的HTTP邏輯should'nt被放置在UI層我的UI層,看起來不好,所以我怎麼能在它傳遞從我的「服務」類的UI層和行爲的價值? –

0

唯一真正的方式來實現,你需要將異步調用完成時在工人類來創建一個事件,並觸發該事件是什麼,所以(僞代碼)...

void StartDownload(object[] parameters) 
{ 
    var req = HttpWebRequest.Create("http://google.com"); 
    req.BeginGetRequestStream(Completed_handler, req); 
} 

void Completed_handler(object sender, DownloadStringCompletedEventArgs e) 
{ 
    var request = (HttpWebRequest)result.AsyncState; 
    var response = request.EndGetResponse(result); 

    using (var stream = response.GetResponseStream()) 
    using (var reader = new StreamReader(stream)) 
    { 
     var contents = reader.ReadToEnd(); 
     NotifyCallerOfContent(contents) 
    } 
} 

public event EventHandler<MyCustomEventArgsClass> DownloadHasFinished; 

public NotifyCallerOfDownload(string content) 
{ 
    if(null != DownloadHasFinished) 
    { 
     DownloadHasFinished(this, new MyCustomEventArgsClass(content)); 
    } 
} 

然後在您的調用類中訂閱DownloadHasFinished事件。

至於由HttpWebRequest的呼喚特別,看看this question,在那裏你會找到一些工作樣本。

+0

這是有點超出我的聯盟,代碼經驗/知識vise害怕,但噸儘管如此。 –

+0

這是一個恥辱 - 這幾乎是唯一可靠的方式來獲得你所需要的。 – ZombieSheep