4

我正在开发一个 windows phone 8 应用程序,在我的应用程序中我正在调用服务并将一些数据下载到我的应用程序中。

我正在使用 httpwebrequest 进行请求,但我无法为我的 httpwebrequest 对象设置超时。

这就是我创建和使用 httpwebrequest 的方式:-

public async Task<string> ServiceRequest(string serviceurl, string request, string methodname)
        {
            string response = "";
            try
            {

                var httpwebrequest = WebRequest.Create(new Uri(serviceurl)) as HttpWebRequest;
                httpwebrequest.Method = "POST";
                httpwebrequest.Headers["SOAPAction"] = "http://tempuri.org/" + iTestservice + "/" + methodname + "";
                httpwebrequest.ContentType = "text/xml";


                byte[] data = Encoding.UTF8.GetBytes(request);
                using (var requestStream = await Task<Stream>.Factory.FromAsync(httpwebrequest.BeginGetRequestStream, httpwebrequest.EndGetRequestStream, null))
                {
                    await requestStream.WriteAsync(data, 0, data.Length);
                }

                response = await httpRequest(httpwebrequest);

            }
            catch (Exception ex)
            {

                return null;
            }

            return response;

        }

        public async Task<string> httpRequest(HttpWebRequest request)
        {
            string received;

            using (var response = (HttpWebResponse)(await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, null)))
            {
                using (var responseStream = response.GetResponseStream())
                {
                    using (var sr = new StreamReader(responseStream))
                    {

                        received = await sr.ReadToEndAsync();
                    }
                }
            }

            return received;
        }

我的疑问是:-

1)如何将超时属性设置为 Httpwebrequest ?

2)我可以在我的 Windows Phone 8 应用程序中设置超时属性的不同方法是什么?

请告诉我 。

提前致谢。

4

2 回答 2

9

您不能HttpWebRequest.Timeout在 Windows Phone 上使用,因为该平台不存在它。

如果您愿意使用 beta 库,则可以HttpClient通过 NuGet安装并使用它的 Timeout属性。

否则,您可能最好使用Microsoft.Bcl.AsyncTaskEx.Delay的一部分。安装该库后,您将替换此行:

response = await httpRequest(httpwebrequest);

有了这个:

var httpTask = httpRequest(httpwebrequest);
var completeTask = await TaskEx.WhenAny(httpTask, TaskEx.Delay(5000));
if (completeTask == httpTask)
  return await httpTask;
else
  return null; // timeout
于 2013-02-23T14:07:39.743 回答
0

您可以使用 HttpStatusCode。HttpStatusCode 是一个枚举,可用于获取 HttpWebRequest 中的错误类型。

catch(WebException ex) {

HttpWebResponse response = (HttpWebResponse)ex.Response;

if(response.StatusCode==HttpStatusCode.GatewayTimeout) { }

}

GatewayTimeout 表示中间代理服务器在等待另一个代理或源服务器的响应时超时。有关详细信息,您可以参考msdn 站点。希望对您有所帮助

于 2015-02-02T10:27:06.533 回答