Wcf 为HttpWebRequest超时问题构建解决方案
我正在使用HTTP Web请求类调用RESTful Web服务。我需要传递数据和接收数据,这一切似乎都很好。今天我尝试配置类的超时,因为运行服务的服务器很可能脱机,我不想浪费时间等待。我对它进行了配置,但似乎没有什么不同。呼叫仍等待了10秒以上才失败 在查看它时,我发现超时只处理呼叫的处理,而事先的DNS查找不包括在内。由于这将是一个问题,这将是有意义的,为什么超时没有工作,因为我的预期 进一步阅读建议改为使用异步样式的HttpWebRequest类。我已经看过了执行此操作的代码,但不了解如何在代码中检索有效同步的回调 我的守则如下:Wcf 为HttpWebRequest超时问题构建解决方案,wcf,rest,asynchronous,Wcf,Rest,Asynchronous,我正在使用HTTP Web请求类调用RESTful Web服务。我需要传递数据和接收数据,这一切似乎都很好。今天我尝试配置类的超时,因为运行服务的服务器很可能脱机,我不想浪费时间等待。我对它进行了配置,但似乎没有什么不同。呼叫仍等待了10秒以上才失败 在查看它时,我发现超时只处理呼叫的处理,而事先的DNS查找不包括在内。由于这将是一个问题,这将是有意义的,为什么超时没有工作,因为我的预期 进一步阅读建议改为使用异步样式的HttpWebRequest类。我已经看过了执行此操作的代码,但不了解如何在
HttpWebRequest _serviceRequest = (HttpWebRequest)WebRequest.Create(new Uri("http://mywebservice.com"));
_serviceRequest.Timeout = 3000;
HttpWebResponse response = (HttpWebResponse)_serviceRequest.GetResponse();
XmlReader reader = XmlReader.Create(response.GetResponseStream(), set);
我必须异步调用的代码以下面一行结束,但我不确定我应该如何获得响应对象
IAsyncResult result = (IAsyncResult)req.BeginGetResponse(new AsyncCallback(RespCallback), reqState);
我还关心这样一个半生不熟的异步解决方案。通过一段同步代码使用异步方法是否是一种良好的实践
任何帮助人员都很感激……调用回调函数RespCallback时,响应将可用。我不知道reqState有什么,但我假设它包含对原始HttpWebRequest对象的引用。如果是这种情况,这将是RespCallback方法的简单实现:
void RespCallback(IAsyncResult asyncResult)
{
ReqState reqState = (ReqState)asyncResult.AsyncState;
HttpWebResponse resp = (HttpWebResponse)reqState.Request.EndGetResponse(asyncResult);
// do what you need with the response.
}
更新:评论中询问的更多信息
如果您希望响应与执行Begin调用的方法相同,则可以在收到回调时设置一个事件,并且可以在Begin调用后等待该事件,如下面的示例所示
class ReqState {
public HttpWebRequest Request { get; set; }
public HttpWebResponse Response { get; set; }
public AutoResetEvent Evt { get; set; }
}
void RespCallback(IAsyncResult asyncResult) {
ReqState reqState = (ReqState)asyncResult.AsyncState;
reqState.Response = (HttpWebResponse)reqState.Request.EndGetResponse(asyncResult);
reqState.Evt.Set();
}
void CallMethod() {
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(...);
// set properties on req
ReqState state = new ReqState();
state.Request = req;
state.Evt = new ManualResetEvent(false);
req.BeginGetResponse(RespCallback, state);
state.Evt.WaitOne(TimeSpan.FromSeconds(30)); // wait for 30 seconds
// access response via state.Response
}
现在请注意,您实际上是以异步方式执行同步调用。这使您能够更好地控制超时,但代价是代码复杂度。另一件事,这在Silverlight和Windows Phone、IIRC等平台上不起作用,在这些平台上,即使是伪装成异步的同步呼叫也是被禁止的。但我的问题是,在同步场景(如aspx页面)中,或者在我的情况下,在wcf服务呼叫中,如何处理这一问题。如何暂停代码以等待回调?使用此注释的答案更新了响应