当前位置: 首页 > 编程语言 > C#

如何为HttpWebRequest定义更积极的超时?分享

时间:2023-04-10 17:39:51 C#

如何为HttpWebRequest定义更积极的超时?在可移植类库中,我有以下方法将数据发布到特定的Url。这种方法非常有效。但我想指定更积极的超时(默认为100秒)。考虑到PortableClassLibrary中的HttpWebRequest类没有Timeout属性,如果调用超过几秒,我如何确保调用被放弃?publicasyncTaskPostAsync(Uriuri,stringdata){HttpWebRequestrequest=(HttpWebRequest)WebRequest.Create(uri);request.Method="POST";request.ContentType="application/x-www-form-urlencoded";(StreamrequestStream=awaitrequest.GetRequestStreamAsync()){byte[]postBytes=Encoding.UTF8.GetBytes(data);requestStream.Write(postBytes,0,postBytes.Length);}HttpWebResponseresponse=(HttpWebResponse.GetyncResponse)等待请求();返回新的HttpResponse(response.StatusCode,awaitnewStreamReader(response.GetResponseStream()).ReadToEndAsync());下面的代码将返回一个HttpWebResponse,如果超时则返回null。HttpWebResponse响应=awaitTaskWithTimeout(request.GetResponseAsync(),100);if(response!=null){....}TaskTaskWithTimeout(Tasktask,intduration){returnTask.Factory.StartNew(()=>{boolb=task.Wait(duration);如果(b)返回(HttpWebResponse)task.Result;返回null;});}–编辑–创建扩展方法会更好如果(b)返回task.Result;返回默认值(T);});}}使用方法是:varresponse=(HttpWebResponse)awaitrequest.GetResponseAsync().WithTimeout(1000);–EDIT2–另一种方法publicasyncstaticTaskWithTimeout(thisTasktask,intduration){varretTask=awaitTask.WhenAny(task,Task.Delay(duration)).ConfigureAwait(false);如果(retTask是任务)返回任务。结果;返回默认值(T);}//如果计时器触发,则中止请求。私有静态无效TimeoutCallback(objectstate,booltimedOut){if(timedOut){HttpWebRequestrequest=stateasHttpWebRequest;if(request!=null){request.Abort();}}}是的,客户端应用程序有责任实现自己的超时机制。您可以在上面的代码中设置超时并使用ThreadPool.RegisterWaitForSingleObject方法来执行此操作。有关完整详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.abort.aspx。本质上,它从GetResponse、BeginGetResponse、EndGetResponse、GetRequestStream、BeginGetRequestStream或EndGetRequestStream中止。以上是C#学习教程:HowtodefineamoreaggressivetimeoutforHttpWebRequest?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: