Тайм-аут HttpWebRequest в WP7 не работает с таймером - PullRequest
3 голосов
/ 05 апреля 2011

Поскольку WP7 HttpWebRequest не поддерживает тайм-аут, я использую таймер для реализации функциональности. Ниже приведен пример. Я вызываю GetConnection () из формы пользовательского интерфейса. Но ReadCallback () никогда не выполняется, пока не истечет время таймера. Как только таймер остановлен, запускается ReadCallBack (). Похоже, поток таймера блокирует ответ HTTP. Любая помощь приветствуется. Я также пробовал ManualResetEvent, и это тоже дает тот же результат.

private HttpWebRequest conn;
private bool _timedOut = false;
private DispatcherTimer tmr;

public void GetConnection()
{
    conn = (HttpWebRequest)HttpWebRequest.Create(new Uri("http://www.contoso.com"));
    conn.Method = "GET";

    tmr = new DispatcherTimer();
    tmr.Interval = TimeSpan.FromSeconds(10);
    tmr.Tick += new EventHandler(tmr_Tick);
    _stopTimer = false;

    IAsyncResult resp = conn.BeginGetResponse(new AsyncCallback(ReadCallback), conn);

    tmr.Start();
}

private void tmr_Tick(object sender, EventArgs e)
{
   if (!_stopTimer)
   {
       tmr.Stop();
       conn.Abort();
   }
}

private void ReadCallback(IAsyncResult asynchronousResult)
{
    _stopTimer = true;
    HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

    m_response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
}

1 Ответ

3 голосов
/ 06 апреля 2011

Ваш код работает, как и ожидалось для меня. Когда вы вызываете Abort () для ожидающего запроса, ваш ReadCallback должен сработать. Затем, когда вы вызываете EndGetResponse (), вы должны получить исключение WebException с Status = RequestCanceled.

Попробуйте этот слегка измененный код, чтобы увидеть это в действии:

private void ReadCallback(IAsyncResult asynchronousResult)
{
    _stopTimer = true;
    HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

    try
    {
        var m_response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
        System.Diagnostics.Debug.WriteLine("Success");
    }
    catch (WebException exc)
    {
        System.Diagnostics.Debug.WriteLine(exc.Status);
    }
}

Смотрите также на MSDN: http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.abort(v=VS.95).aspx

" Метод Abort отменяет запрос к ресурсу. После отмены запроса вызов метода BeginGetResponse, EndGetResponse, BeginGetRequestStream или EndGetRequestStream вызывает WebException со свойством Status, для которого установлено значение RequestCanceled. "

...