Ошибка GetResponse() из-за "WebRequest"

Я пытаюсь сделать запрос к API Google. Но я получаю сообщение об ошибке с GetResponse(). Ошибка, которую я получаю, это...

'WebRequest' does not contain a definition for 'GetResponse'...

Visual Studio дает мне возможность заменить это на BeginGetResponse(), но я не уверен, как отформатировать код или изменить то, что у меня уже есть для этого. Может ли кто-нибудь указать мне правильное направление, чтобы решить эту проблему? Возможно, я пропускаю некоторые сборки... но я так не думаю.

private void SearchButton_Click(object sender, RoutedEventArgs e)
    {    
      var address = addressInput.Text;
      var requestUri = string.Format("https://maps.googleapis.com/maps/api/geocode/json?address={0}&sensor=false", Uri.EscapeDataString(address));

      MessageBox.Show(requestUri.ToString());


      var request = WebRequest.Create(requestUri);
      var response = request.GetResponse();
      var xdoc = XDocument.Load(response.GetResponseStream());    

      var result = xdoc.Element("GeocodeResponse").Element("result");
      var locationElement = result.Element("geometry").Element("location");
      var lat = locationElement.Element("lat");
      var lng = locationElement.Element("lng");
}

person daveskylark    schedule 06.01.2017    source источник
comment
попробуйте применить его, (HttpWebResponse) request.GetResponse();   -  person Ferryzijl    schedule 06.01.2017
comment
Я попробовал это, и GetResponse() по-прежнему несовместим.   -  person daveskylark    schedule 06.01.2017
comment
что за заявление пишешь?   -  person Daniel A. White    schedule 06.01.2017
comment
в зависимости от того, с какой версией фреймворка вы связываетесь, это может быть GetResponseAsync.   -  person Daniel A. White    schedule 06.01.2017
comment
Возможно, версия System.Net не использует GetResponse()... idk.   -  person daveskylark    schedule 06.01.2017
comment
я имею в виду, это wpf, мобильный, универсальные окна и т. д.   -  person Daniel A. White    schedule 06.01.2017
comment
Давайте продолжим обсуждение в чате.   -  person Daniel A. White    schedule 06.01.2017


Ответы (1)


Вы можете использовать асинхронную версию следующим образом:

var request = WebRequest.Create(requestUri);
request.BeginGetResponse(this.FinishWebRequest, request);

а затем есть метод FinishWebRequest, который будет вызываться после того, как удаленный сервер отправит ответ:

private void FinishWebRequest(IAsyncResult result)
{
    var request = (HttpWebRequest)result.AsyncState;
    using (var response = request.EndGetResponse(result))
    using (var responseStream = response.GetResponseStream())
    {
        var xdoc = XDocument.Load(responseStream);
        ...
    }
}

или если вы предпочитаете использовать анонимный метод:

var request = WebRequest.Create(requestUri);
request.BeginGetResponse(result => 
{
    using (var response = request.EndGetResponse(result))
    using (var responseStream = response.GetResponseStream())
    {
        var xdoc = XDocument.Load(responseStream);
        ...
    }
}, null);
person Darin Dimitrov    schedule 06.01.2017
comment
Разве мне не нужен метод BeginGetResponseStream? - person daveskylark; 06.01.2017
comment
Да, вам нужно, как показано в моем примере: response.BeginGetResponseStream(this.FinishGetResponseStream, response);. После получения объекта ответа в обратном вызове FinishWebRequest следующее, что вы делаете, это BeginGetResponseStream на нем, чтобы иметь возможность получить окончательный объект Stream в обратном вызове FinishGetResponseStream. - person Darin Dimitrov; 06.01.2017
comment
Можете ли вы дать несколько советов? Ошибка времени компиляции? Ошибка выполнения? Что-то другое? - person Darin Dimitrov; 06.01.2017
comment
Ошибка времени компиляции: BeginGetResponseStream и EndGetResponseStream выдают ту же ошибку, что и GetResponse() в начале... WebResponse does not contain a definition for BeginGetResponseStream и выдают то же самое для EndGetResponseStream. - person daveskylark; 06.01.2017
comment
ОК, мой плохой, см. мой обновленный ответ. По-видимому, нет методов BeginGetResponseStream/EndGetResponseStream, что еще больше упрощает код. - person Darin Dimitrov; 06.01.2017
comment
Добавьте, если я хочу проверить ответ или результат, я могу сделать что-то вроде MessageBox.Show(response.ToString()); после var xdoc = XDocument.Load(responseStream);... верно? Или, может быть, ответ должен быть xdoc? - person daveskylark; 06.01.2017
comment
MessageBox.Show(xdoc.ToString()); или просто поставьте точку останова и проверьте значение. - person Darin Dimitrov; 06.01.2017