4

我无法按照示例获取回调。

我有以下代码:

 private void startWebRequest(object sender, EventArgs e)
    {
        Uri url = new Uri("http://localhost.com/dummyGet");
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
        request.BeginGetResponse(new AsyncCallback(ReadWebRequestCallback), request);
    }

    private void ReadWebRequestCallback(IAsyncResult callbackResult)
    { 
        Console.WriteLine("Don not get here");
        try
        {
            var req = (HttpWebRequest)callbackResult.AsyncState;
            using (var response = req.EndGetResponse(callbackResult))
            {
                Console.WriteLine("Code");
            }
        }
        catch
        {  }
    }

我整天都在努力解决这个问题,我可以在浏览器中看到获取请求,或者在 fiddler/wireshark 中看到客户端。但是代码(ReadWebRequestCallback)没有被调用。

编辑:还要注意,如果我使用 WebClient 和 DownloadStringAsync 它可以工作,但我需要 404 和 200 以外的其他 HTTP 状态代码。:

_client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(DownloadStringCompleted);
_client.DownloadStringAsync(_concurrentCheckUrl);
}

private void DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {// Works, gets here}
4

2 回答 2

1

我不确定这是否是解决方案,但是在调用回调之前是否已关闭拥有线程?作为silverlight,我对此表示怀疑,但我想我会提出来。

检查http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetresponse.aspx - 注意

ThreadPool.RegisterWaitForSingleObject (result.AsyncWaitHandle, new WaitOrTimerCallback(TimeoutCallback), myHttpWebRequest, DefaultTimeout, true);

  // The response came in the allowed time. The work processing will happen in the 
  // callback function.
  allDone.WaitOne();

这可能是您应该通过 Thread.Sleep 尝试的方法。如果这不是问题,为了安全起见,您能否通过添加断点或其他输出语句来确认代码永远不会触发?

于 2012-07-10T15:28:05.143 回答
0

非常感谢所有的帮助!

我最终按照Simplify Async network with Tasks in SL5 with tasks 中的描述进行了操作。

HttpWebRequest _request;

private void doGetRequest()
  _request = WebRequestCreator.ClientHttp.Create(new Uri("http://localhost/getDummy")) as HttpWebRequest;
        var webTask = Task.Factory.FromAsync<WebResponse>
            (_request.BeginGetResponse, _request.EndGetResponse, null)
          .ContinueWith(
            task =>
            {
                var response = (HttpWebResponse)task.Result;
                // The reason I use HttpRequest, not WebRequest, to get statuscode.
                if (response.StatusCode == HttpStatusCode.ServiceUnavailable)
                {
                     //Do Stuff
                }
            });

但是,我确实认为问题在于我的日志记录在回调中时没有记录,这是我无法理解的。但是在把我的头撞到墙上一天之后,我会把它抛在脑后。但认为我的实际帖子会起作用。

于 2012-07-10T20:00:52.137 回答