Wcf 为HttpWebRequest超时问题构建解决方案

Wcf 为HttpWebRequest超时问题构建解决方案,wcf,rest,asynchronous,Wcf,Rest,Asynchronous,我正在使用HTTP Web请求类调用RESTful Web服务。我需要传递数据和接收数据,这一切似乎都很好。今天我尝试配置类的超时,因为运行服务的服务器很可能脱机,我不想浪费时间等待。我对它进行了配置,但似乎没有什么不同。呼叫仍等待了10秒以上才失败 在查看它时,我发现超时只处理呼叫的处理,而事先的DNS查找不包括在内。由于这将是一个问题,这将是有意义的,为什么超时没有工作,因为我的预期 进一步阅读建议改为使用异步样式的HttpWebRequest类。我已经看过了执行此操作的代码,但不了解如何在

我正在使用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服务呼叫中,如何处理这一问题。如何暂停代码以等待回调?使用此注释的答案更新了响应