简体   繁体   中英

Set Timeout of 10 seconds to HttpWebRequest in WP8.1

I need to set a timeout of 10 seconds to all the Http web request in Wp8.1 app. I dont find a Timeout instead a ContinueTimeout property in the HttpWebRequest class.

A Quick search gave be few alternatives. Using a CancellationToken being one and the other one is using Task. Will some one give me pointers as to how to modify my current code.

This is how I'm creating a request

string uri = MyClass.HTTP_URI + "user/server-timestamps";
var request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = MyClass.HTTP_GET;
request.Accept = "application/json";
request.Headers[HTTP_AUTHENTICATION_TOKEN] = "token"
request.Headers[API_KEY] = API_KEY_VALUE;

This is how I'm sending the request

     try
     {
          WebResponse responseObject = await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, request);
          HttpWebResponse response = (HttpWebResponse)responseObject;
          statusCode = (int)response.StatusCode;
          if (statusCode == 200)
             {
                 var responseStream = responseObject.GetResponseStream();
                 var sr = new StreamReader(responseStream);
                 received = await sr.ReadToEndAsync();
                 //Do stuff
             }
     }

You can use HttpClient class and CancellationTokenSource. Just modify it.

try
{
     CancellationTokenSource cts = new CancellationTokenSource(2000);

     HttpClient client = new HttpClient();
     client.DefaultRequestHeaders.Accept.Add(new Windows.Web.Http.Headers.HttpMediaTypeWithQualityHeaderValue(""));
     HttpRequestMessage msg = new HttpRequestMessage(new HttpMethod("POST"), new Uri("Url"));

     HttpResponseMessage response = await client.SendRequestAsync(msg).AsTask(cts.Token);
}
catch(TaskCanceledException ex)
{

}

You can create an extension method than accepts CancellationToken and use it like this:

var request = (HttpWebRequest)WebRequest.Create(uri);
// ...
try 
{
    using (var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10)))
    {
        await request.GetResponseAsyncCancelable(cts.Token);
    }
}
catch (OperationCanceledException)
{
    // handle cancellation, if desired
}

// ...
public static class HttpWebRequestExt
{
    public static async Task<HttpWebResponse> GetResponseAsyncCancelable(
        this HttpWebRequest @this, 
        CancellationToken token)
    {
        using (token.Register(() => request.Abort(), useSynchronizationContext: false))
        {
            try
            {
                // BTW: any reason why not use request.GetResponseAsync,
                // rather than FromAsync? It's there in WP 8.1:
                // var response = await request.GetResponseAsync();

                var response = (HttpWebResponse)await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, request);
                token.ThrowIfCancellationRequested();
                return response;
            }
            catch (WebException ex)
            {
                // WebException caused by cancellation?
                if (!token.IsCancellationRequested)
                    throw; // no, just re-throw
                // yes, wrap it with OperationCanceledException
                throw new OperationCanceledException(ex.Message, ex, token);
            }
        }
    }
}

BTW, is there any reason you're not using GetResponseAsync , which is there in WP 8.1? See the code comments inline.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM