簡體   English   中英

將WP8.1中的HttpWebRequest設置為10秒的超時

[英]Set Timeout of 10 seconds to HttpWebRequest in WP8.1

我需要為Wp8.1應用程序中的所有Http Web請求設置10秒的超時。 我沒有在HttpWebRequest類中找到Timeout而是ContinueTimeout屬性。

快速搜索給出了幾種選擇。 使用CancellationToken作為一個,另一個使用Task。 請問有人給我有關如何修改當前代碼的指示。

這就是我創建請求的方式

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;

這就是我發送請求的方式

     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
             }
     }

您可以使用HttpClient類和CancellationTokenSource。 只需對其進行修改。

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)
{

}

您可以創建一個擴展方法,而不是接受CancellationToken並像這樣使用它:

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);
            }
        }
    }
}

順便說一句,是否有任何原因不使用WP 8.1中的GetResponseAsync 請參見內聯代碼注釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM