2013-03-14 19 views
2

我使用這種方法來獲得谷歌建議查詢:中止的HttpWebRequest不會工作

public void GetSuggestFromGoogle(string query) 
    { 
     try 
     { 
      query = HttpUtility.UrlEncode(query); 
      string targetUrl = "http://suggestqueries.google.com/complete/search?ds=yt&output=toolbar&hl=en-US&q=" + query; 

      UTF8Encoding utf8 = new UTF8Encoding(); 
      byte[] bytes = utf8.GetBytes(targetUrl); 
      targetUrl = targetUrl.ToString(); 

      request = HttpWebRequest.Create(new Uri(targetUrl)) as HttpWebRequest; 
      request.Method = "GET"; 

      IsDownload = true; 
      request.BeginGetResponse(new AsyncCallback(FinishWebRequest), request); 
     } 
     catch 
     { 
      IsDownload = false; 
      failCallback(); 
     } 


    } 

之前我調用這個方法我用:

public void CancelGoogleRequest() 
    { 
     if (IsDownload) 
     { 
      request.Abort(); 
      IsDownload = false; 
     } 
    } 

,這是完成請求方法:

private void FinishWebRequest(IAsyncResult result) 
    { 
     try 
     { 
      HttpWebResponse wResponse = (result.AsyncState as HttpWebRequest).EndGetResponse(result) as HttpWebResponse; 
      Stream stream = wResponse.GetResponseStream(); 

      StreamReader reader = new StreamReader(stream); 
      string xml = reader.ReadToEnd(); 

      List<string> list = this.ParseXml(xml); 
      finishCallback(list); 
      IsDownload = false; 
     } 
     catch//(Exception erere) 
     { 
      IsDownload = false; 
      failCallback(); 
     } 
    } 

而我的問題是與HttpWebRequest中止,即使我放棄請求調用一個新的O之前執行FinishWebRequest方法,可以取消它嗎?

回答

1

從備註部分中HttpWebRequest.Abort

Abort方法將同步執行指定 的BeginGetRequestStream或BeginGetResponse方法回調如果中止 方法被調用,而無論這些操作都很優秀。

所以你不能避免呼叫。但是你已經有你的IsDownload標誌,並且可以使用這種方式:當您更改取消方法,這樣

private void FinishWebRequest(IAsyncResult result) 
{ 
    if (IsDownload) 
    { 
     // handle response 
    } 
} 

public void CancelGoogleRequest() 
{ 
    if (IsDownload) 
    { 
     IsDownload = false; // set before Abort 
     request.Abort(); 
    } 
} 

UPDATE:如果你不能使用IsDownload標誌,你可以簡單地依靠以下(也在備註):

Abort方法取消對一個RESOUR的請求CE。請求被 取消後,調用的GetResponse,BeginGetResponse,EndGetResponse, GetRequestStream,BeginGetRequestStream,或EndGetRequestStream方法 導致引發WebException設置爲RequestCanceled

狀態屬性正如你身邊已經有了你的迴應try塊處理代碼,一切都應該沒問題。然而,你不應該設置IsDownload = false在當一個新的請求已經啓動的異常處理程序,至少不會在引發WebException狀態是RequestCanceled

private void FinishWebRequest(IAsyncResult result) 
{ 
    try 
    { 
     // handle response 
    } 
    catch (WebException webEx) 
    { 
     if (webEx.Status != WebExceptionStatus.RequestCanceled) 
     { 
      IsDownload = false; 
      failCallback(); 
     } 
    } 
    catch 
    { 
     IsDownload = false; 
     failCallback(); 
    } 

} 

另一個想法。作爲Abort調用FinishWebRequest回調同步,您可以使用IsAborted標誌是這樣的:

public void CancelGoogleRequest() 
{ 
    if (IsDownload) 
    { 
     IsDownload = false; // set before Abort 
     IsAborting = true; 
     request.Abort(); 
     IsAborting = false; 
    } 
} 

像這樣的回調:

private void FinishWebRequest(IAsyncResult result) 
{ 
    if (!IsAborting) 
    { 
     // handle response 
    } 
} 
+0

,因爲當我取消呼叫我無法使用isDownload標誌我立即打電話給另一個 – MTA 2013-03-14 16:21:20

+0

在這種情況下WebExceptionStatusid RequestCanceled ?? – MTA 2013-03-14 16:40:08

+0

請參閱[這裏](http://msdn.microsoft.com/en-us/library/System.Net.WebExceptionStatus.aspx):'請求被取消了,WebRequest。調用Abort方法,或發生不可分類的錯誤。這是Status'的默認值。不是很有幫助,我猜... – Clemens 2013-03-14 16:43:39